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#中什麼是接口?所謂的接口其實就是一種規范,使得實現接口的類或結構在形式上保持一致,當一個類去繼承該接口時,就必須實現該接口的所有成員,使用接口可以使程序更加清晰和條理化,這就是接口的好處。 所以,在上面的例子中,我們可以定義一個接口,讓EFDAL和ADODAL去繼承這個接口
//定義一個接口,當使用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層的代碼而就能改變不同的數據庫訪問方式,答案當然是有的。我們可以創建一個工廠,通過反射的方法去創建一個實例
/// <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層之間的耦合,也就是所謂的解耦。