代码之家  ›  专栏  ›  技术社区  ›  Martin

ASP.NET中数据绑定可维护性的最佳实践

  •  7
  • Martin  · 技术社区  · 16 年前

    我想知道在可维护性方面,使用ASP.NET数据绑定的最佳实践是什么。

    我不希望应用程序在必须更改数据库时崩溃。

    我应该完全用codebehind进行数据绑定吗?我计划使用ObjectDatasources进行数据绑定。有没有比使用数据绑定更容易维护的东西,如果有,是什么?

    在设计数据访问层和业务层时,是否需要考虑这些因素?

    谢谢。

    3 回复  |  直到 16 年前
        1
  •  4
  •   Matt Briggs    16 年前

    我的哲学是数据访问的东西在标记中没有业务。对象数据源比SQL数据源更好,但我喜欢将标记保留为将在页面上呈现的唯一内容。我还喜欢您对数据绑定内容的控制,这些数据绑定内容总是从代码后面得到的。

        2
  •  2
  •   Community CDub    8 年前

    好问题!

    就数据绑定而言,您应该只将其视为 总体数据访问策略的一个组成部分。 我的策略有三个组件(我在组件2中了解到您的数据绑定):

    首先,我总是创建(或重用)一个数据访问层(DAL)来简化数据访问。这是 因为我可能有一天会把你的数据库换成另一个——这种可能性很小,不足以保证所有需要的工作(雅格尼)。这样做是为了a)从普通数据库代码中删除所有混乱(例如获取连接字符串、设置和关闭连接等);b)使用专用函数简化常见操作。

    其次,你绝对 应该 实现用于封装UI控件的数据绑定的对象数据源。如果你已经建立了一个好的DAL,这将变得非常微不足道。例如,这里有一个使用我的DAL的对象数据源:

        [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 (a.ClassID=@ClassID) AND ")
                        .ParamVal(classID)
                        .Append("(DateDiff(d, a.ClassDate, @ClassDate) = 0) Order By LastName;")
                        .ParamVal(classDate)
                        .ReturnList<EnrollListMemberData>();
            }
        }
    

    需要注意的几点:“dataobjectmethodattribute”属性将使该方法对设计时环境可见,以便在链接网格(或其他)时在数据源的下拉列表中看到它。您还需要提供此方法的类的[dataObjectAttribute]属性(如果该类是我的业务层的一部分,则为该类)。最后,这是一个非常简单的例子,并且没有一些常见的结构,比如startrowindex和maximumrows参数来返回分页结果。

    注意这里的特殊调用来自于我的dal——它不是linqtosql,尽管它有一个表面相似性。我喜欢SQL,但我不喜欢 希望 C习语 just have an arbitrary mapping back to SQL anyway . 请注意,如果我试图在直接的ADO调用中实现所有这些,那么这个函数的长度将是它的三倍,并且有很多代码实际上与表达我的目标无关。

    第三,我总是在存储过程中放置多步数据库操作,以最小化通过连接到数据库的调用次数。例如,我在一个产品中提供了一个“签入”功能,它接受签入请求,对照成员表检查它,检索以前的签入历史记录(上个月有多少次访问?)如果合适的话,奖励奖励奖励积分等。在C代码中运行对数据库的多个查询和更改将非常复杂和昂贵。根据我们的DAL理念,我还将对存储过程的调用封装在DAL中,以便代码的实际调用只是:

    int status=dal.checkin(用户ID,参考checkinHistory);

    如您所见,使用存储过程并将其封装到C类方法中也会使代码 远的 更容易阅读。我的代码只是说明它的作用(如上所述),而不是有100多行代码设置查询等。

    希望这有帮助!

        3
  •  0
  •   Martin    16 年前

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

    我问了以下问题:

    如果从codebehind进行数据绑定,则 仍然需要定义字段 在标记中。你要怎么做 当然了,你的生意发生了变化 对象不会破坏页面?

    当数据绑定时,如果强制转换对象,则会在编译时检测到它,如果属性名已更改或不再存在。

    例:

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

    此外,这样做将避免使用eval,据报道eval速度较慢,因为它使用反射。(我自己没有真正检查性能影响)