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

时间:2009-02-17 19:00:53

标签: .net asp.net data-binding oop maintenance

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

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

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

在设计我的数据访问层和业务层时,是否需要考虑?

感谢。

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

好问题!

就数据绑定而言,您应该将其视为整个数据访问策略中的的一个组件。我的策略有三个组件(我在组件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”属性将使此方法对设计时环境可见,以便在您链接网格时在数据源的下拉列表中看到它(管他呢)。您还需要提供此方法的类的[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多行代码设置查询等等。

我希望这有帮助!

答案 2 :(得分:0)

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

我问了以下问题:

  

如果您从代码隐藏中进行数据绑定,那么   仍然需要定义你的字段   在标记中。你会怎么做   确保您的业务发生变化   对象不会破坏页面?

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

例:

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

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