在開發一個項目的時候,有時候會碰到這樣一個問題:就是項目開發到一半時,原先對數據庫的訪問走的是ADO.NET,中途項目經理忽然要求改爲使用EF實體模型去訪問數據庫......呃好吧!這樣的話就須要去把原有的代碼個修改,咱們都知道在ADO.Net中,數據訪問層DAL與業務邏輯層是耦合在一塊的,當數據訪問層的代碼由原來的使用ADO.NET去訪問數據庫變爲使用EF實體模型去訪問數據庫時,業務邏輯層BLL的代碼也要去相應的改變(這是一件至關痛苦的事情)數據庫
1 //private UserEFDAL userefDal = new UserEFDAL();//當項目使用EF去訪問數據庫時建立一個實例 2 3 // private UserInfoDAL userDal = new UserInfoDAL();//當項目使用ADO去訪問數據庫時建立一個實例 4 //可是以上的方法當數據庫訪問的方法改變時,BLL層都要作出相應的改變而且不能保證改變後nwe出的實例名稱相同 5 //那樣就至關的悲劇了、、、、 6 public User Add(User userInfo) 7 { 8 return userDal.EFAdd(userInfo);//當經過兩種方法new出來的實例名稱不一樣時,悲催了。。。。 9 10 //return userefDal.ADOAdd(userInfo); 11 }
經過上面的簡單的代碼咱們能夠發現,當咱們要切換數據庫的訪問方式時,須要不斷的去改變new實例的名稱,而且在EF中定義的添加的方法叫EFAdd,在ADO中定義的添加的方法叫ADOAdd,這樣去修改代碼的的工程很是的浩大(當你去改完時,估計你也被炒魷魚了),而咱們又但願可以在當數據訪問的方式不用的時候,BLL層的代碼改變不多,或者不去改變BLL層的代碼就能切換數據庫訪問的方式,咱們但願在不一樣是數據訪問方式不一樣時,內部的方法不變,咱們規定在ADO或是EF中添加的方法爲Add、修改的方法爲Edit等。說到這,想必你們應該明白接下去要說的是什麼了,沒錯,就是接口,在C#中什麼是接口?所謂的接口其實就是一種規範,使得實現接口的類或結構在形式上保持一致,當一個類去繼承該接口時,就必須實現該接口的全部成員,使用接口可使程序更加清晰和條理化,這就是接口的好處。spa
因此,在上面的例子中,咱們能夠定義一個接口,讓EFDAL和ADODAL去繼承這個接口code
//定義一個接口,當使用ADO.NET訪問數據庫或是時候EF實體模型訪問時,都繼承於這個接口 public interface IDALInterface { //這裏還能夠定義多個成員 User Add(User userInfo); } //EFDAL去繼承IDALInterface這個接口 public class UserEFDAL : IDALInterface { DataModelContainer db = new DataModelContainer(); public User Add(User userInfo) { db.User.AddObject(userInfo); db.SaveChanges(); return userInfo; } } public class UserInfoDAL : IDALInterface//ADO.NET訪問數據庫時繼承IDALInterface接口 { /// <summary> /// 實現IDALInterface接口 /// </summary> /// <param name="userInfo"></param> /// <returns></returns> public User Add(User userInfo) { //這裏執行Add操做並返回插入的實體 return userInfo; } }
//BLL層代碼 IDALInterface userDal = new UserEFDAL(); //在這裏由於EF的DAL與ADo的DAL都繼承自IDALInterface //當訪問數據庫的方式改變後,只要改變相應的數據庫訪問實例。這樣就減小的代碼的改動量 public User Add(User userInfo) { return userDal.Add(userInfo); //return userefDal.Add(userInfo); }
經過上面的例子,咱們能夠看到,只要在BLL層改變new不一樣的的實例,而不須要去改變太多的BLL的代碼,就能夠在不一樣的數據訪問的方式切換,固然仍是須要在BLL層修改代碼。咱們仍是須要去一個個的找 IDALInterface userDal = new UserEFDAL();,而後去修改,有沒有一種方法能夠作到不去修改BLL層的代碼而就能改變不一樣的數據庫訪問方式,答案固然是有的。咱們能夠建立一個工廠,經過反射的方法去建立一個實例blog
/// <summary> /// 建立一個簡單的工廠來獲取相應的程序集, /// </summary> /// <returns></returns> public static IDALInterface GetDALStyle() { string assemblyName = ConfigurationManager.AppSettings["assemblyName"];//經過配置文件來配置數據庫的訪問的方式 string typeName = ConfigurationManager.AppSettings["typeName"]; //經過反射建立一個實例 return Assembly.Load(assemblyName).CreateInstance(typeName) as IDALInterface; }
而相應的BLL的代碼就改爲繼承
IDALInterface userDal = DALSimpleFactory.GetDALStyle();//經過工廠去建立一個實例 public User Add(User userInfo) { return userDal.Add(userInfo); //return userefDal.Add(userInfo); }
至此,咱們就只需在配置文件中去修改相應的配置,就能夠在不修改過多的代碼下完成不一樣數據庫訪問方式的切換,大大減小的項目的開發的週期,經過工廠來得的實例,能夠大大的減小BLL層與DAL層之間的耦合,也就是所謂的解耦。接口