抽象工厂+反射+依赖注入 实现对数据访问层和业务逻辑层的优化

分层思想的一个核心就是部件化,各个层之间是相互独立的,每一层可以随便抽取换成一个其他语言的版本,但只要与相应的接口吻合就行。

我用的三层架构大致是这样的,基本的三层就不说了,然后分别为业务逻辑层和数据访问层定义一个接口,由具体的那个层来实现,问题产生了,由谁来指定程序使用哪个具体的对象来实现相应接口?

为解决这个问题,我应用的是抽象工厂模式。分别为业务逻辑层和数据访问层添加一个抽象工厂。具体架构还是看下图吧。

这里的Utility是一个工具类,在下文中会提到。

学过设计模式的人都应该听过反射技术,但是一个系统中用到的类很多,需要对每一个类进行实例化,如果仅利用抽象工厂+反射模式,重复的代码比较多,如果哪一天整个DAL层发生变更,那么就要在代码中修改每一个用到的地方,不仅不容易维护,而且还很容易出错,未解决这个问题,对程序作了一个优化——用到依赖注入。还是看看代码吧。

1、先看看依赖注入的容器:这里我把这个注入容器放到了工具类中,刚开始学习设计模式,不知道是否合理,欢迎高手们指点。

[vb]  view plain copy
  1. Imports System.Configuration  
  2. Imports System.Reflection  
  3. Public Class DependencyInjector  
  4.   
  5.     ''' <summary>  
  6.     ''' 利用反射机制,取得数据访问层对象  
  7.     ''' </summary>  
  8.     ''' <param name="className">传入数据访问层中要实例化的类的名称</param>  
  9.     ''' <returns>指定的数据访问层的类</returns>  
  10.     ''' <remarks></remarks>  
  11.     Public Function GetDALObject(ByVal className As StringAs Object  
  12.         Dim dal As Object  
  13.         Dim dalName As String  
  14.         Dim fullClassName As String  
  15.         Dim dalObj As Object  
  16.   
  17.         '通过配置文件的指定要应用的DAL层  
  18.         dal = System.Configuration.ConfigurationManager.AppSettings("DAL")  
  19.   
  20.         'dalName就是常说的用用程序的名称  
  21.         dalName = dal.ToString  
  22.   
  23.         '命名空间+类的名称,指明要实例化的类的路径  
  24.         fullClassName = dalName + "." + className  
  25.         '通过反射,取得数据访问层对象  
  26.         dalObj = Assembly.Load(dalName).CreateInstance(fullClassName)  
  27.         '返回指定的对象  
  28.         Return dalObj  
  29.   
  30.     End Function  
  31.   
  32.   
  33.     ''' <summary>  
  34.     '''取得指定业务逻辑层的指定类  
  35.     ''' </summary>  
  36.     ''' <param name="className">要应用的业务逻辑层的具体类的名称</param>  
  37.     ''' <returns>指定的业务逻辑层的类(对象)</returns>  
  38.     ''' <remarks></remarks>  
  39.     Public Function GetBLLObject(ByVal className As StringAs Object  
  40.   
  41.         Dim bll As Object  
  42.         Dim bllName As String  
  43.         Dim bllObj As Object  
  44.         Dim fullClassName As String  
  45.   
  46.         '从配置文件中读取业务逻辑名称  
  47.         bll = System.Configuration.ConfigurationManager.AppSettings("BLL")  
  48.         bllName = bll.ToString  
  49.   
  50.         fullClassName = bllName + "." + className  
  51.   
  52.         '利用反射取得业务逻辑层对象  
  53.         bllObj = Assembly.Load(bllName).CreateInstance(fullClassName)  
  54.   
  55.         Return bllObj  
  56.   
  57.     End Function  
  58. End Class  

2、相关配置文件:

[html]  view plain copy
  1. <appSettings>  
  2.     <add key="connStr"  value="Persist Security Info=true;Data Source=*****;Initial Catalog=Charge_Sys_SelfDesign;User ID=sa;PWD=****;" />  
  3.     <add key="DAL"  value="DAL" />  
  4.     <add key
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值