回到目錄Lind.DDD.Repositories.EF以下簡稱Repositories.EF,之所以把它從Lind.DDD中拿出來,完全出於可插拔的考慮,讓大家都能休會到IoC的魅力,用到哪種方法持久化,就將那個DLL放到應用程式中,完全不需要把所有持久化方式耦合到一個項目里,這也是遵循了OCP的...
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>
最後,我們非常希望各位同學都學有所成...