三层架构利用抽象工厂模式解耦

如图:
现在这是基本的三层架构调用顺序,耦合性非常的高,给我们带来了很多问题,
比如我们现在项目用的是Sqlserver数据库,现在要求更换数据库,变成MySql,那就是说明我们的DAL层需要的是MySqlDal,那此时我们BLL层的代码也需要改变,此时可能要更改数次非常的麻烦
我们要解决的2个问题:

图中 指出的两处 就是我们所说的问题所在 只要更换数据库,那这2处就一定会变
这时,就需要解耦利用抽象工厂模式达到不更改代码不编译实现更换数据库
1.使用接口 让该类实现该接口,

这样的话我们所说的第一处问题就已经解决,这里永远是我们定义的接口
那么第二处该怎么解决呢?
2.使用抽象工厂,我们需要什么类就创建什么类
主要思路:读取配置文件中的程序集名和类的全名(更改的话只需要修改配置文件),通过反射获取该类型 然后创建 返回
1 1.修改配置文件 2 在 <appSettings>下添加key和value(程序集名,类的全名) 3 <add key="BookTypeDal" value="BookShop.DAL,BookShop.DAL.BookType" /> 4 2.在Factory类下添加方法 5 6 public class AbstractFactory 7 { 8 public static BookShop.IDAL.IBookType CreateBookType() 9 { 10 //反射 11 string AssemblyName = ConfigurationManager.AppSettings["BookTypeDal"].Split(',')[0]; 12 string ClassName=ConfigurationManager.AppSettings["BookTypeDal"].Split(',')[1]; 13 Assembly assembly= Assembly.Load(AssemblyName);//程序集名称 14 return assembly.CreateInstance(ClassName) as BookShop.DAL.BookType;//类的全名 15 } 16 }
此时我们只需修改BLL层

这样我们的2处问题都已经解决,如果更换数据库的话 只需要修改配置文件!

浙公网安备 33010602011771号