我想知道在可维护性方面使用asp.net DataBinding的最佳做法是什么。在asp.net中进行DataBinding维护的最佳做法
当我不得不对数据库进行更改时,我不希望应用程序崩溃。
我应该在代码隐藏中完全绑定数据吗?我正在计划使用ObjectDataSources进行数据绑定。有没有比使用数据绑定更容易维护的东西,如果是,它是什么?
有没有考虑因素,我在设计数据访问层和业务层时应该考虑到这些因素?
谢谢。
我想知道在可维护性方面使用asp.net DataBinding的最佳做法是什么。在asp.net中进行DataBinding维护的最佳做法
当我不得不对数据库进行更改时,我不希望应用程序崩溃。
我应该在代码隐藏中完全绑定数据吗?我正在计划使用ObjectDataSources进行数据绑定。有没有比使用数据绑定更容易维护的东西,如果是,它是什么?
有没有考虑因素,我在设计数据访问层和业务层时应该考虑到这些因素?
谢谢。
我的理念是数据访问的东西在标记中没有任何业务。对象数据源比SQL数据源更好,但我喜欢将我的标记保留为只会呈现在页面上的东西。我也更喜欢你掌握的东西是什么东西,你总是从背后的代码中获得数据。
好问题!
就数据绑定而言,您应该将它看作只有整体数据访问策略的一个组件。我的策略有三个组成部分(我到了组件2中的DataBinding):
首先,我总是创建(或重新使用)数据访问层(DAL)来简化数据访问。这是而不是,因为有一天我可能会将数据库换成另一个数据库 - 这种机会很渺茫,不能保证所有需要的工作(YAGNI)。您可以这样做,以便您可以A)从常规数据库代码中删除所有混乱(例如,获取连接字符串,设置和关闭连接等),并且B)使用专用函数简化常见操作。
其次,你绝对是应该实现ObjectDataSources封装你的UI控件的DataBinding。如果你已经构建了一个好的DAL,这变得很微不足道。例如,下面是一个使用我的DAL一个ObjectDataSource控件:
[DataObjectMethodAttribute(DataObjectMethodType.Select, true)]
public List<EnrollListMemberData> GetNameList(int classID, DateTime classDate)
{
using (BSDIQuery qry = new BSDIQuery())
{
return
qry.Command(
"Select a.ClassDate, a.ClientID, b.FirstName, b.LastName, b.ID From ClassEnroll a inner join Folder b on (a.ClientID = b.ClientID) Where ([email protected]) AND ")
.ParamVal(classID)
.Append("(DateDiff(d, a.ClassDate, @ClassDate) = 0) Order By LastName;")
.ParamVal(classDate)
.ReturnList<EnrollListMemberData>();
}
}
有几件事情要注意:“DataObjectMethodAttribute”属性将使这个方法可见的设计时环境,让你在看到它当你去连接你的Grid(或其他)时,下拉数据源列表。您还需要提供此方法的类的[DataObjectAttribute]属性(如果此业务层是我的业务层的一部分,则为该类)。最后,这是一个非常简单的例子,并没有一些常见的结构,例如用于返回分页结果的startRowIndex和maximumRows参数。
请注意,此处的特定调用来自我的DAL - 即使它具有表面相似性,它也不是LinqToSQL。我喜欢SQL,我不想想要 C#成语just have an arbitrary mapping back to SQL anyway。请注意,如果我试图在直接的ADO调用中实现所有这些功能,该功能将是三倍的时间,并且有大量代码与表达我的目标无关。
第三,我总是将多步骤数据库操作置于存储过程中,以最大限度地减少通过数据线连接的调用数量。例如,我在一个产品中提供了“签入”功能,该功能会接受签入请求,根据成员资格表对其进行检查,检索先前签入的历史记录(上个月有多少次访问?),在适当的情况下颁发奖励点,等等。在C#代码中运行多个查询和更改数据库将非常复杂且相当昂贵。为了与我们的DAL哲学保持一致,我还将调用存储过程调用到DAL中,以便实际的代码调用只是:
int status = dal.CheckIn(userID,ref checkInHistory);如您所见,使用存储过程并将其封装在C#类方法中也使得代码远至更易于阅读。我的代码只是说它做了什么(如上),而不是有100多行代码设置查询等。
我希望这有助于!
为了完整起见,我想在第一个答案中添加关于我的评论的内容。
我提出以下问题:
如果从代码隐藏数据绑定,你 仍会有该标记来定义的字段 。您如何确定 确定您的商家 对象的更改不会破坏页面?
当数据绑定时,如果您施放了对象,它将在编译时检测到,如果属性名称已更改或者不再存在。
例:
<%# ((ObjetType)Container.DataItem).PropertyName %>
而且,这样做,将避免使用eval,该报道是缓慢的,因为它使用反射。 (没有真正检查自己的性能影响)
谢谢,但在标记中,如果您从代码隐藏数据绑定,您仍然必须在标记中定义您的字段。您如何确保业务对象中的更改不会破坏页面? – Martin 2009-02-17 20:34:16
你可以做的事情不多,对象数据源也不能真正解决这个问题。在发布之前只需测试一下这些变化 – 2009-02-17 20:36:17