gpt4 book ai didi

c# - 如何将 DBcontext 对象传递给继承 GenericRepository 抽象类的实体的构造函数

转载 作者:行者123 更新时间:2023-11-30 22:28:06 28 4
gpt4 key购买 nike

请帮帮我,我应该如何将 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 对象,以便我可以通过。

请解释一下各种方法的区别。

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

非常感谢。

最佳答案

编辑

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

事后看来,工厂注入(inject)更可取,并像这样使用:

  public ConsumingClass(IRepositoryFactory injectedRepositoryFactory)

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

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

或通过实现 IDisposable在类里面。

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

原始答案

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

例如使用构造函数注入(inject):

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

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

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

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

其他替代方案是类似 Service Locator Pattern 的模式(现在通常被认为是一种反模式,因为它将类耦合到定位器)和 Factory Method .

关于c# - 如何将 DBcontext 对象传递给继承 GenericRepository<T> 抽象类的实体的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10974070/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com