首页 > 代码库 > 三层架构之抽象工厂加反射----实现数据库转换

三层架构之抽象工厂加反射----实现数据库转换

项目要求使用SqlServer数据库与Access数据库切换。需求是只要把webconfig中的配置一改就可以实现数据来源在SqlServerAccess之间切换。经过思考,觉得可以用抽象工厂来实现这一功能,后边仔细一想,感觉有点麻烦,后边想到了用反射来实现。

思路是这样的:将数据访问层抽取出来,提取成接口DomeIDAL类库,再不同的数据库建立不同的数据访问层实现接口,如使用SqlServer话就对应有一个SqlServer的数据访问类库项目SqlServerDAL,里面的类对应实现DemoIDAL中的接口,AccessAccessDAL数据访问类库对应,这样将不同的数据库的访问抽取出来。然后再建一个反射工厂DemoFactory,用来创建不同的数据访问对象,实现是这样的,在webconfig中配置要使用的数据访问层的程序集名称,如使用Access的话,就配AccessDAL,然后在发射工厂中读webconfig配置,这样就能利用发射加载该程序集了,然后在BLL层中传对应的类名,让工厂来生产出该类的对象。这样就实现了只要在webconfig中配置好要使用的数据访问层的程序集名称,就能实现使用那个数据访问层来访问数据库了。


例如在数据访问层有这样的两个接口IUser和IProduct  分别用SqlServer和Access实现的方式如下图所示:


现在通过业务逻辑层BLL 需要实例化一个实现了IUser的实例来访问DAL层 

如果直接使用IUser userRep=new SqlServerUser() 则BLL层和DAL层之间有着强耦合的关系。 不够完美  

当需要更改DAL层为Access方式实现时,需要改动大量的BLL层new的实例代码。

可以使用 抽象工厂加反射的方式,通过反射机制获取配置文件中的信息,来确定是使用哪种方式实现的DAL层。

通过抽象工厂 是的BLL层和DAL的访问依赖于工厂,达到解耦的目的


PS:配置文件必须在界面层

   反射的写法:

objType=Assembly.Load(AssemblyPath).CreateInstance(className);

其中:AssemblyPath指程序集名。className 指命名空间.类名称。

反射的一个原则:

一切皆以UI层的bin文件夹中的dll名称为中心。(原因很简单:.net类加载的机制就是默认从本程序集的bin文件中找,所以bin文件夹中一定要有要加载的程序集的dll)。UI层中bin文件夹中dll叫什么名字AssemblyPath就使用什么名字,bin内部类的全名叫什么,className就写成什么全名。.net中的引用:加入对某个程序集的引用就能在程序集有变化时自动拷贝dll。