文章出處

回到目錄

Lind.DDD.Repositories.EF以下簡稱Repositories.EF,之所以把它從Lind.DDD中拿出來,完全出于可插拔的考慮,讓大家都能休會到IoC的魅力,用到哪種方法持久化,就將那個DLL放到應用程序中,完全不需要把所有持久化方式耦合到一個項目里,這也是遵循了OCP的原則,對擴展是開放的,即你可以添加其它的持久化方式,在新的項目里;而不要在原有的項目中進行代碼的修改.

Repositories.EF做為數據持久化的一種方式,它直接繼承了Lind.DDD.IRepositories接口模塊,它實現了IRepository,IExtensionRepository和IOrderableRepository等倉儲操作,開發人員在使用時,可以根據自己的需要去聲明不同的接口變量,以最小程度的使用它,而不是所以時候都使用IExtensionRepository的完整接口,如你的類中只用到了實體的添加,那你完全可以把對象聲明成IRepository基本倉儲,這樣你的使用時,也更加清楚.

Repositories.EF項目結構很簡單,只有一個Repository的實現,看一下結構圖

它內部使用了IExtensionRepository接口,由于IExtensionRepository同時繼承了IRepository和IOrderableRepository,所以,EF在實現它時,這兩個基接口也會現時被實現.

其實對于方法內部的實現,大叔之前的文章中已經介紹很多了,大叔可以自已進行查閱,之后這個Repositories.EF倉儲在實現項目中不會出現,它只會通過IoC在程序運行時動態生產出來,這點大叔要清楚,不要把Repositories.EF引用到你的項目中使用,這樣你的項目將會變得非常僵化,很被動,持久化無法自動切換,這點要注意!

在具體項目中使用時,我們可以通過web.config去定義你持久化的方式,在程序使用時,直接用Lind.DDD.IoC.ServiceLocator服務定位器即可.

        IExtensionRepository<Task_Info> taskRepository;
        public UserService()
        {          
            taskRepository = ServiceLocator.Instance.GetService<IExtensionRepository<Task_Info>>();
            taskRepository.SetDataContext(Db);
        }
  <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
    <container>
      <!--泛型類型注入-->
      <register type="Lind.DDD.IRepositories.IRepository`1,Lind.DDD" mapTo="Lind.DDD.Repositories.EF.EFRepository`1, Lind.DDD.Repositories.EF" />
      <register type="Lind.DDD.IRepositories.IExtensionRepository`1,Lind.DDD" mapTo="Lind.DDD.Repositories.EF.EFRepository`1, Lind.DDD.Repositories.EF" />
    </container>
  </unity>

最后,我們非常希望各位同學都學有所成...

回到目錄


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()