6

似乎有很多關於實現Linq to SQL的Repository模式的示例。其中大多數都具有IRepository和DI;有些已經實施了工作單位,有些則沒有。我嘗試將大部分由SO和Google上的搜索返回的結果閱讀爲從Linq到SQL存儲庫模式。儘管如此,我還沒有遇到完整的解決方案。Linq to SQL使用IoC,依賴注入,工作單元的存儲庫模式

從我讀,我實現了一個存儲庫模式,如下圖所示:

repository pattern

我使用DI登記在其上存儲庫依賴接口:

this.container.RegisterType<IConnectionStringFactory, ConnectionStringFactory>(new ContainerControlledLifetimeManager(), 
    new InjectionConstructor(connectionString)); 
this.container.RegisterType<IDataContextFactory, DataContextFactory>(); 

實施存儲庫模式:

public interface IPrivilegeRepository : IRepository<PrivilegesEntity> 
{ 
    IList<MenuModel> GetRootMenu(); 
    IList<MenuModel> GetChildMenu(int parentId); 
} 

public class PrivilegeRepository : Repository<PrivilegesEntity>, IPrivilegeRepository 
{ 
    #region IPrivilegeRepository Members 

    public IList<MenuModel> GetRootMenu() 
    { 
     return FindAll(menu => menu.ParentId == null) 
      .OrderBy(menu => menu.SortOrder) 
      .Select(c => EntityMapper.Privileges.ToBusinessObject(c)) 
      .ToList(); 
    } 

    public IList<MenuModel> GetChildMenu(int parentId) 
    { 
     return FindAll(menu => menu.ParentId == parentId) 
      .OrderBy(menu => menu.SortOrder) 
      .Select(menu => EntityMapper.Privileges.ToBusinessObject(menu)) 
      .ToList(); 
    } 

    #endregion 

    public PrivilegeRepository(IDataContextFactory dataContextFactory) 
     : base(dataContextFactory) 
    { 
    } 
} 

IRepository通用接口:

public interface IRepository<T> where T : class 
{ 
    IEnumerable<T> All(); 
    IEnumerable<T> FindAll(Expression<Func<T, bool>> exp); 
    T Single(Expression<Func<T, bool>> exp); 
    T First(Expression<Func<T, bool>> exp); 
} 

庫類被實現,如下面IRepository(未示出)的實施方式中,並具有上IDataContextFactory依賴性其中DI正在的護理:

public class Repository<T> : IRepository<T> where T : class 
{ 
    public Repository(IDataContextFactory dataContextFactory) 
    { 
     this.dataContextFactory = dataContextFactory; 
    } 
} 

存儲庫被消耗使用IoC:

PrivilegeRepository repository = container.Resolve<PrivilegeRepository>(); 

我將查詢的結果作爲Business Object的集合返回以避免依賴Lin q到我使用存儲庫的應用程序層上的SQL。上述場景適用於使用MVVM模式的WPF應用程序。我有ViewModel aks Presenter類,它們不依賴Linq-SQL生成的類。

如何擴展此模式以便將數據保存到數據庫。我想將Business Objects傳遞迴存儲庫並保存它們。可能嗎?如何在這種情況下實施工作單元。

+0

你可能想看看活動記錄模式;它涵蓋了完整的CRUD操作以及類似存儲庫的查詢訪問功能。 – 2009-10-26 11:19:54

+0

與VS2010一起發佈的實體框架如何? – Raj 2009-11-08 05:55:44

+0

@Raj我想你錯過了他想成爲ORM獨立的事實。 – Novus 2012-07-26 17:36:20

回答

1

那麼這是一個我見過很多次的問題。您希望將業務對象從數據存儲策略中解耦出來。當你對業務對象進行投影時,你會失去很多存儲庫的好處(例如,可以使用緩衝執行返回IQueryable)。例如,您可以實現此目的的唯一方法是讓您的存儲庫對IMapper<BusinessObject>有依賴性。通過這種方式,您可以將您的業務對象映射到存儲庫所需的對象,以便存儲某些內容,但由於業務對象仍然無法保持持久性,請將抽象放在適當位置。

5

Here is an answer of mine to a similar question.

的基本思路是,通用倉庫接口不工作這麼好,但通用倉庫實現工作的高度。它使用LINQ to SQL作爲示例ORM,並應提供一些有關您的問題的信息。

一定要通讀保羅的答案,特別是評論。