繁体   English   中英

asp.net中DataBinding的可维护性最佳实践

[英]Best practices for DataBinding in asp.net for maintainability

我想知道在可维护性方面使用asp.net DataBinding的最佳实践是什么。

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

我应该完全在代码隐藏中进行数据绑定吗? 我打算使用ObjectDataSources进行数据绑定。 是否存在比使用数据绑定更容易维护的东西,如果是这样,它是什么?

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

谢谢。

我的理念是数据访问内容在标记中没有业务。 对象数据源比SQL数据源更好,但我喜欢将我的标记保留为只会呈现在页面上的内容。 我也更喜欢你控制的东西是你从后面的代码总是做的数据绑定。

好问题!

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

首先,我总是创建(或主要重用)数据访问层(DAL)以简化数据访问。 不是因为我有一天可能会将你的数据库替换为另一个数据库 - 这种可能性足够小,以至于它不能保证所有需要的工作(YAGNI)。 这样做是为了你可以A)从正常的数据库代码中删除所有混乱(例如获取连接字符串,设置和关闭连接等)和B)使用专用函数简化常见操作。

其次,您绝对应该实现为您的UI控件封装DataBinding的ObjectDataSources。 如果你已经建立了一个好的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 (a.ClassID=@ClassID) 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#习惯用法反正只有SQL的任意映射 请注意,如果我尝试在直接ADO调用中实现所有这些,那么这个函数将是三倍长,并且有很多代码与表达我的目标没有密切关系。

第三,我总是在存储过程中放置​​多步数据库操作,以最大限度地减少通过数据线连接的调用次数。 例如,我在一个产品中提供“检入”功能,该功能接受检入请求,根据成员资格表进行检查,检索以前的检入历史记录(上个月有多少次访问?),如果合适,奖励激励点,在C#代码中运行多个查询和对数据库的更改将非常复杂且非常昂贵。 为了与DAL理念保持一致,我还将调用封装在DAL中的存储过程中,以便代码的实际调用只是:

int status = dal.CheckIn(userID,ref checkInHistory);

正如你所看到的,使用存储过程,并在C#类方法封装它也使代码容易阅读。 我的代码只是说它做了什么(如上所述),而不是有100多行代码设置查询等。

我希望这个对你有用!

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

我问了以下问题:

如果你从代码隐藏数据绑定,你仍然需要在标记中定义你的字段。 您如何确保业务对象中的更改不会破坏页面?

当数据绑定时,如果你转换了对象,它将在编译时检测,如果属性名称已更改或不再存在。

例:

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

此外,这样做,将避免使用Eval,因为它使用反射,因此报告速度很慢。 (没有真正检查自己的性能影响)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM