我正在使用Web表单,C#,
Asp.net.
众所周知,在这个模型中,UI和业务逻辑经常混合在一起.如何有效地分离这些?
我想使用的例子是:
我有一个GridView和一个DataTable(GridView绑定到DataTable,DataTable从存储过程中提供).
我希望将GridView(UI)和DataTable(业务逻辑)解耦.
为DataTable编写包装器是否值得?是否有经过验证和测试的实用模式,您可以建议遵循这些模式?
如果有经验的人能够发光,那就太棒了.
而且,作为最后一点,我想说ASP MVC现在不是一个选项,所以不推荐它.
我的数据库访问层返回一个DataTable.
请注意,我必须使用此数据库层,因为这是公司策略.
最佳答案 我最近经历了这个,同时从我们的UI层解耦了很多相同的东西.
在我看来,A DataTable并不代表业务逻辑.具体来说,它的数据直接从数据库中提取.业务逻辑将该数据转换为真正有用的业务对象.
然后,第一步是将DataTable与Business对象分离.
您可以通过创建对象和List< object>来实现.组成DataTables和DataTables的集合,然后您可以创建一个显示这些对象的ListView.我在上面发布的链接中介绍了后面的步骤.前面的步骤就像下面这样简单:
>创建一个代表您的对象的类.
>遍历您的DataTable(或DataSet,或者您检索数据)并将这些字段推送到该对象的属性(或List< T>);
>将List返回到Gridview或ListView进行显示.
这样,ListView或Gridview就不会与您检索数据的方法紧密耦合.如果您决定稍后从JSON查询或XML文件获取数据会发生什么?然后你必须把它建在那里.
第1步 – 从数据库获取数据
有多种方法可以从数据库中获取数据,我无法在这里查看所有数据.我假设您已经知道如何从数据库中检索数据,如果不这样做,则需要遵循quite a few links.让我们假装您已连接到数据库,并使用SQLDataReader来检索数据.我们会去那里.
类图
Foo
----
id
Name
Description
这是方法:
private void FillDefault(SqlDataReader reader, Foos foo)
{
try
{
foo.id = Convert.ToInt32(reader[Foo.Properties.ID]);
foo.Name = reader[Foo.Properties.NAME].ToString();
if (!string.IsNullOrEmpty(
reader[Foo.Properties.DESCRIPTION].ToString()))
foo.Description =
reader[Foo.Properties.DESCRIPTION].ToString();
else foo.Description = string.Empty;
}
catch (Exception ex)
{
throw new Exception(
string.Format("Invalid Query.
Column '{0}' does not exist in SqlDataReader.",
ex.Message));
}
}
一旦发生这种情况,您可以通过在针对SQLDataReader.Read()函数的while循环中执行该过程来返回列表.
一旦你这样做,让我们假装你返回的Foo是一个List.如果你这样做,并按照我上面给出的第一个链接,你可以替换Dictionary< TKey,TValue>与列表< T>并获得相同的结果(略有不同). Properties类只包含数据库中的列名,因此您有一个地方可以更改它们(如果您想知道).
DataTable – 基于注释的更新
您始终可以插入中间对象.在这个例子中,我在DataTable和UI之间插入了一个Business Layer,我已经讨论了我上面要做的事情.但是DataTable不是业务对象;它是数据库的直观表示.您无法将其传输到UI层并将其称为解耦.他们说你必须使用DataTable,他们是否说你必须将那个DataTable传输到UI?我无法想象他们会这样.如果你这样做,那么你永远不会被解耦.在DataTable和UI层之间总是需要一个中间对象.