在这篇博客中提到了”DAL层依赖循环调用错误,不知道是代码还是设计上的原因?“这个错误,今天重新检查了一下,确定后是程序的错误,而不是设计的原因。
http://blog.csdn.net/lmdcszh/article/details/7172325
在贴代码之前,先来对比一下优化后的架构。
之前的架构设计包图:
优化后的架构设计包图:
优化后减少了一层,因为Utility层放置的是一些查询工具和辅助工具,如:SQLHelp类、接口泛化的类等,这样DAL层之与Utility层有依赖,而原先的DependenncyInjector这个依赖注入的类放到Factory封装到包中就行,因为这个类的唯一目的就是优化BLL和DAL层的工厂。
最后把工厂中依赖注入的的类的代码贴出来,供大家参考一下:
Imports System.Configuration Imports System.Reflection Public Class DependencyInjector ''' <summary> ''' 利用反射机制,取得数据访问层对象 ''' </summary> ''' <param name="className">传入数据访问层中要实例化的类的名称</param> ''' <returns>指定的数据访问层的类</returns> ''' <remarks></remarks> Public Function GetDALObject(ByVal className As String) As Object Dim dal As Object Dim dalName As String Dim fullClassName As String Dim dalObj As Object '通过配置文件的指定要应用的DAL层 dal = System.Configuration.ConfigurationManager.AppSettings("DAL") 'dalName就是常说的用用程序的名称 dalName = dal.ToString '命名空间+类的名称,指明要实例化的类的路径 fullClassName = dalName + "." + className '通过反射,取得数据访问层对象 dalObj = Assembly.Load(dalName).CreateInstance(fullClassName) '返回指定的对象 Return dalObj End Function ''' <summary> '''取得指定业务逻辑层的指定类 ''' </summary> ''' <param name="className">要应用的业务逻辑层的具体类的名称</param> ''' <returns>指定的业务逻辑层的类(对象)</returns> ''' <remarks></remarks> Public Function GetBLLObject(ByVal className As String) As Object Dim bll As Object Dim bllName As String Dim bllObj As Object Dim fullClassName As String '从配置文件中读取业务逻辑名称 bll = System.Configuration.ConfigurationManager.AppSettings("BLL") bllName = bll.ToString fullClassName = bllName + "." + className '利用反射取得业务逻辑层对象 bllObj = Assembly.Load(bllName).CreateInstance(fullClassName) Return bllObj End Function End Class
事实上这里的代码跟原来的架构中的依赖注入的类的代码是一模一样的,需要改动的是实例化的路径和添加引用。比较简单就不在赘述。