快速业务通道

微型项目实践(9):页面的数据访问策略

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20

上一篇中,我们完成了数据库的访问,今天我们来看看系统设计的最后一部分——UI层。加入了UI层 之后,系统设计会变成这个样子:

微型项目实践(9):页面的数据访问策略

这也就是系统最终的结构图。这个图上新添加的两个项目,一个是UI,一个是WebSite。其中前者依赖 于业务逻辑和数据访问,提供统一的界面处理,而WebSite仅包含Aspx页面。需要注意的是,上图中箭头 表示依赖或调用,而这个关系是具有传递性的,比如UI依赖于Business,而Business依赖于Common,则UI 自然就依赖于Common。

将UI和WebSite分写在两个项目中,是我个人的一个习惯。其中UI主要包含页面基类和Helper类,还有 数据库的获取方法,对于多种界面(比如既提供Web也提供WinForm)的系统,这一层次的抽象是必要的, 而对于只提供Web访问的系统,把UI层放在WebSite中的App_Code文件夹下也无不可。

UI层中,目前就有两个核心类,一个是所有页面的基类,另一个是数据库生成类,其类结构图如下:

微型项目实践(9):页面的数据访问策略

其中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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号