程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#——依賴接口編程與簡單工廠

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

編輯:C#入門知識

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#中什麼是接口?所謂的接口其實就是一種規范,使得實現接口的類或結構在形式上保持一致,當一個類去繼承該接口時,就必須實現該接口的所有成員,使用接口可以使程序更加清晰和條理化,這就是接口的好處。         所以,在上面的例子中,我們可以定義一個接口,讓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層之間的耦合,也就是所謂的解耦。    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved