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,并应提供一些有关您的问题的信息。

一定要通读保罗的答案,特别是评论。