我想知道在可维护性方面使用asp.net DataBinding的最佳做法是什么。
当我不得不对数据库进行更改时,我不希望应用程序崩溃。
我应该在代码隐藏中完全数据绑定吗?我打算使用ObjectDataSources进行数据绑定。是否存在比使用数据绑定更容易维护的东西,如果是,它是什么?
在设计我的数据访问层和业务层时,是否需要考虑?
感谢。
答案 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,因为它使用反射,因此报告速度很慢。 (我自己没有真正检查性能影响)