阿牛 - 专注.NET开发

如果梦想与实现之间有一道不可逾越的鸿沟,那么“执行力”就是跨越这道鸿沟的桥梁。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

在现实的ASP.NET编程中,我们一个ASPX页面通常需要显示很多种类的数据(如:用户基本信息,用户订单明细,网站新闻等)。这些不同的数据通常在不同的类,不同的方法读取,每个方法中都会打开连接,关闭连接一次。尽管ADO.NET的连接池,但频繁的Dispose Connection对象,对性能也有一定的影响。还有如果一个操作要执行多个业务方法,事务必须要一致,这时也要确保多个方法共用一个Connection对象。

 

对此问题,Open Session in View可以很好地解决这个问题。


用OO封装的原则来解决问题,现在变化的是Connection连接这一块,那么就把它“解放“出去。
我们定义一个Singleton的类ConnectionFacade,用它来为DAL的方法服务。DAL不再有"管理Connection"的责任,它们只要获取到一个Connection对象使用就行了。ConnectionFacade内部会管理好Connection。它只要公开一个方法GetCurrentConnection就行了。

 

大家知道Web和Windows程序的不同,Web程序一次请求,服务器会分派一个线程执行代码,而Windows程序一直是一个线程在内存中。因此,连接管理策略也是不同的。


1. Web下一次Request建立一个Connection,我们可以自行编写一个HttpModule,在BeginRequest事件中打开Connection,EndRequest事件中关闭Connection.
2. WinForms下一个程序一个Connection,启动时打开Connection, 退出时关闭Connection.

 

为了使我们的代码能适应Web和WinForms两种表示层,我们把这个“变化点”再次“封装”起来。用一个接口表示:IConnectionStrategy,并用两个子类:WebConnectionStrategy和WinConnectionStrategy来分别处理。

 

ConnectionFacade中增加一个方法SetStrategy用来设置我们应该使用哪种Connection管理方式.


1. 对于WebForms, App_Start事件中ConnectionFacade.SetStrategy注册一下WebConnectionStrategy。自己编写的HttpModule自动打开/关闭Connection。
2. 对于WinFroms,在Main方法中ConnectionFacade.SetStrategy注册一下WinConnectionStrategy。并OpenConnection, 结束时CloseConnection.

 

整个设计用策略+外观模式现实。

 

附上class diagram,供大家参考,也欢迎有高人提出建议.

 

有空我会一分现实的代码出来.

posted on 2009-02-18 14:55  阿牛-专注金融行业开发  阅读(459)  评论(0编辑  收藏  举报