7

似乎有很多关于为 Linq to SQL 实现存储库模式的示例。其中大部分以 IRepository 和 DI 为特色;有些已经实施了工作单元,有些没有。我试图阅读 SO 和 Google 在 Linq to SQL 存储库模式上搜索返回的大部分结果。尽管如此,我还没有遇到一个完整的解决方案。

根据我的阅读,我实现了一个存储库模式,如下所示:

存储库模式
(来源:sites.google.com 上的 baburajpb

我正在使用 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);
}

Repository 类通过 IRepository 的实现(未显示)实现如下,并且依赖于 DI 负责的 IDataContextFactory:

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

使用 IoC 使用存储库:

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

我将查询结果作为业务对象的集合返回,以避免在我使用存储库的应用程序层上依赖 Linq to SQL。上述场景适用于我使用 MVVM 模式的 WPF 应用程序。我有 ViewModel aks Presenter 类,它们不依赖于 Linq-SQL 生成的类。

如何扩展此模式以便将数据保存到数据库。我想将业务对象传回存储库并保存它们。可能吗?在这种情况下如何实现工作单元。

4

2 回答 2

5

这是我对类似问题的回答。

基本思想是通用存储库接口不能很好地工作,但通用存储库实现工作得很好。它使用 LINQ to SQL 作为示例 ORM,应该为您的问题提供一些见解。

一定要通读保罗的回答,尤其是评论。

于 2011-08-11T20:04:36.903 回答
1

嗯,这是我见过很多次的问题。您希望将业务对象与数据存储策略分离。当您对业务对象进行投影时,您失去了拥有存储库的许多不错的功能(例如,您可以返回 IQueryable 使用延迟执行)。实现这一点的唯一方法是让你的存储库依赖于一个IMapper<BusinessObject>例子。通过这种方式,您可以将您的业务对象映射到您的存储库需要的对象,以便存储一些东西,但由于您的业务对象仍然对持久性无知,所以将抽象保留在适当的位置。

于 2011-08-11T19:22:39.020 回答