2009-02-17 46 views
7

我想知道在可维护性方面使用asp.net DataBinding的最佳做法是什么。在asp.net中进行DataBinding维护的最佳做法

当我不得不对数据库进行更改时,我不希望应用程序崩溃。

我应该在代码隐藏中完全绑定数据吗?我正在计划使用ObjectDataSources进行数据绑定。有没有比使用数据绑定更容易维护的东西,如果是,它是什么?

有没有考虑因素,我在设计数据访问层和业务层时应该考虑到这些因素?

谢谢。

回答

4

我的理念是数据访问的东西在标记中没有任何业务。对象数据源比SQL数据源更好,但我喜欢将我的标记保留为只会呈现在页面上的东西。我也更喜欢你掌握的东西是什么东西,你总是从背后的代码中获得数据。

+0

谢谢,但在标记中,如果您从代码隐藏数据绑定,您仍然必须在标记中定义您的字段。您如何确保业务对象中的更改不会破坏页面? – Martin 2009-02-17 20:34:16

+0

你可以做的事情不多,对象数据源也不能真正解决这个问题。在发布之前只需测试一下这些变化 – 2009-02-17 20:36:17

2

好问题!

就数据绑定而言,您应该将它看作只有整体数据访问策略的一个组件。我的策略有三个组成部分(我到了组件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多行代码设置查询等。

我希望这有助于!

0

为了完整起见,我想在第一个答案中添加关于我的评论的内容。

我提出以下问题:

如果从代码隐藏数据绑定,你 仍会有该标记来定义的字段 。您如何确定 确定您的商家 对象的更改不会破坏页面?

当数据绑定时,如果您施放了对象,它将在编译时检测到,如果属性名称已更改或者不再存在。

例:

<%# ((ObjetType)Container.DataItem).PropertyName %> 

而且,这样做,将避免使用eval,该报道是缓慢的,因为它使用反射。 (没有真正检查自己的性能影响)