2

请帮帮我,我应该如何将DBContext对象传递给类的构造函数 MyEntityRepsitory

例如:

public interface IRepository<T> where T: class
{   
}

public class Repository<T> : IRepository<T> where T : class
{
    private readonly DbContext _dbContext;

    public Repository(DbContext dbContext)
    {
        _dbContext = dbContext;
    }
}

public interface IMyEntity : IRepository<MyEntity>
{
    MyEntity GetSingle(int Id);
}

public class MyEntityRepository : Repository<MyEntity>, IMyEntity
{
    public MyEntityRepository() : base(mydbContext){}
}

我是数据访问层设计模式和实现存储库模式的新手。我从未使用过结构图/工作单元模式。

我想知道,我可以通过多少种方式创建DbContext对象以便通过。

请向我解释各种方法的区别。

在上面的示例中,named 类MyEntityRepository有一个构造函数并将dbContext对象传递给Repository类构造函数。请告诉我该怎么做。

非常感谢。

4

1 回答 1

3

编辑

DbContext根据@Trevor de Koekoek 的评论,从线程和事务边界的角度来看,直接注入拥有 a 的包装器可能会出现问题。

事后看来,注入工厂是可取的,并且像这样使用:

  public ConsumingClass(IRepositoryFactory injectedRepositoryFactory)

然后(如果持有对工厂的引用)

      using (var applesRepository = _injectedRepositoryFactory.CreateRepository<Apples>())
      {
          ... do something with apples
      }

或通过IDisposable在类上实现。

这为客户端提供了一个干净的存储库,并强制客户端获取存储库实例的所有权。

原始答案

正如您所建议的,您应该配置一个 IoC 容器(如 StructureMap)来为您执行此操作 - 需要使用 an 的类IRepository<T>将通过构造函数或 setter 注入注入一个实例。这个 IMO 是最干净的实现,因为它具有可测试性,与 Repository 的耦合仅通过接口,并且 Repository 和消费类都没有耦合到 IoC 容器。

例如使用构造函数注入:

public class ConsumingClass
{
  public ConsumingClass(IRepository<Apples> injectedApplesRepository)
}

到其具体类的映射IRepository是通过 IoC 引导程序(或在配置中)完​​成的。为了提高可测试性,我还将您的存储库耦合到IDbContext,而不是DbContext,例如

private void ConfigureIoC()
{
  For<IDbContext>().Use<MyDbContext>();
  For<IRepository<T>>().Use<Repository<T>>();
  // ... etc
}

当您的消费类由 IoC 构建时,它将递归地检测所有依赖项(IRepository<T>然后依次IDbContext)并构建它们,以及它们的依赖关系等。

其他替代方案是诸如服务定位器模式(现在通常被视为反模式,因为它将类与定位器耦合)和工厂方法之类的模式。

于 2012-06-11T03:53:49.433 回答