C#——依賴接口編程與簡單工廠

      在開發一個項目的時候,有時候會碰到這樣一個問題:就是項目開發到一半時,原先對數據庫的訪問走的是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層之間的耦合,也就是所謂的解耦。接口

相關文章
相關標籤/搜索