微型项目实践(9):页面的数据访问策略
上一篇中,我们完成了数据库的访问,今天我们来看看系统设计的最后一部分——UI层。加入了UI层 之后,系统设计会变成这个样子: 这也就是系统最终的结构图。这个图上新添加的两个项目,一个是UI,一个是WebSite。其中前者依赖 于业务逻辑和数据访问,提供统一的界面处理,而WebSite仅包含Aspx页面。需要注意的是,上图中箭头 表示依赖或调用,而这个关系是具有传递性的,比如UI依赖于Business,而Business依赖于Common,则UI 自然就依赖于Common。 将UI和WebSite分写在两个项目中,是我个人的一个习惯。其中UI主要包含页面基类和Helper类,还有 数据库的获取方法,对于多种界面(比如既提供Web也提供WinForm)的系统,这一层次的抽象是必要的, 而对于只提供Web访问的系统,把UI层放在WebSite中的App_Code文件夹下也无不可。 UI层中,目前就有两个核心类,一个是所有页面的基类,另一个是数据库生成类,其类结构图如下: 其中DatabaseGateWay的作用就是读取Web.Config中数据库链接节点的连接字符串,并调用DataAccess 层的方法,构造新的数据库: 1: namespace DongBlog.UI 2: { 3: /// <summary> 4: /// 数据库 5: /// </summary> 6: public class DatabaseGateWay 7: { 8: private const string DatabaseConnectionConfigurationName = "DongBlogDatabaseConnectionString"; 9: 10: /// <summary> 11: /// 取得新的数据库 12: /// </summary> 13: /// <returns>新数据库</returns> 14: public static IDatabase GetNewDatabase() 15: { 16: return Database.New(ConfigurationManager .ConnectionStrings [DatabaseGateWay.DatabaseConnectionConfigurationName] .ConnectionString); 17: } 18: } 19: } 该类的GetNewDatabase()静态方法,是类型安全的,也是唯一使用到了DataAccess层具体实现的地方 ,系统的其它部分都只了解IDatabase而不了解其实现,更换不同的DataAccess只需要修改此方法。 PageBase类是所有Aspx页的基类,该类在该系统中只提供了数据库访问功能,即一个页面对应一个数 据库访问,代码如下: 11: namespace DongBlog.UI 12: { 13: /// <summary> 14: /// 所有页面的基类 15: /// </summary> 16: public class PageBase : Page 17: { 18: private IDatabase _Database = DatabaseGateWay.GetNewDatabase(); 19: 20: /// <summary> 21: /// 取得数据库访问 22: /// </summary> 23: protected IDatabase Database 24: { 25: get { return _Database; } 26: } 27: } 28: } 一个页面对应一个IDatabase,对于Linq来说,就是一个页面对应一个DataContext,这保证页面生存 周期中的所有业务实体都来源或依附于同一个DataContext,避免了跨DataContext传递实体的问题。在 Linq中,一个DataContext产生的Entity交由另一个DataContext中使用是一件非常麻烦的事情,必须保证 实体必须使用Attach方法附加到新的DataContext上,如果不附加,则新的DataContext会认为该Entity是 new出来的,这会导致再数据库中插入一条新的记录,而不是与现存记录建立关联,这个Bug很难调试,因 为不会显示任何错误。我们举个例子说明这个 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |