库模式使用LINQ到SQL使用了IoC,依赖注入,工作单位(Repository pattern w

2019-09-01 05:32发布

似乎有很多的例子在实施库模式的LINQ到SQL。 他们大多设有IRepository和DI的; 一些已经实施工作的单位,有些不是。 我试图读取大多数通过SO和谷歌上搜索的Linq返回到SQL存储库模式的结果。 不过我还没有碰到过一个完整的解决方案呢。

从我读,我实现了一个存储库模式,如下图所示:

我使用DI登记在其上存储库依赖接口:

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

Repository模式的实施情况:

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(未示出)的实施方式和正对IDataContextFactory依赖性其中DI正在的护理:

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

库使用IoC的消耗:

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

我为了返回的查询结果作为业务对象的集合,以避免依赖的LINQ到SQL在哪里我消耗储存库应用程序层。 上述情况正常工作与使用MVVM模式我的WPF应用程序。 我有不依赖通过的LINQ SQL生成的类视图模型AKS演示课。

如何延长这种模式让我可以将数据保存到数据库中。 我想通过Business Objects的回库,并让他们保存。 可能吗? 我怎么能在这种情况下实施工作的单位。

Answer 1:

这里是我的一个类似的问题的答案。

其基本思路是,通用库接口不工作这么好,但通用仓库实现工作的伟大。 它使用LINQ to SQL作为例子ORM,并应提供一些见解你的问题。

一定要通过保罗的回答读为好,特别的意见。



Answer 2:

嗯,这是我见过很多次的问题。 你想拥有你的业务对象的解耦从您的数据存储策略。 当你做了投影到你的业务对象,你失去了很多有仓库的不错的功能(例如,你可以利用递延执行返回的IQueryable)。 可以实现这一点的唯一方法是给你的仓库的依赖朝着IMapper<BusinessObject>的例子。 这样,您就可以将业务对象映射到对象存储库的需要,以存储的东西,但在原位留下抽象为业务对象保持持久性无知。



文章来源: Repository pattern with Linq to SQL using IoC, Dependency Injection, Unit of Work