我正在重构一个项目,该项目在数据存储库中为每个方法调用创建多个DbCOntexts。 所以我希望每个HTTP请求都有一个DbContext实例。
我试过这样做:
container.RegisterType<ApplicationDbContext>(new PerRequestLifetimeManager());
以及每个存储库:
...
container.RegisterType<IBusinessRepository, BusinessRepository>(new InjectionConstructor(new ApplicationDbContext()));
container.RegisterType<ICountryRepository, CountryRepository>();
...
但是,这将为每个存储库创建一个新的DbContext()实例。
我试过
container.RegisterType<IBranchCategoryRepository, BranchCategoryRepository>(
new InjectionConstructor(container.Resolve<ApplicationDbContext>()));
但这给了我:
PerRequestLifetimeManager只能在。的上下文中使用 HTTP请求。导致此错误的可能原因是使用生命周期 非ASP.NET应用程序上的管理器,或者在一个线程中使用它 与适当的同步上下文无关。
那么如何将相同的实例注入每个存储库?
答案 0 :(得分:2)
我不熟悉Unity,但我和其他各种IoC框架一样。
您为什么要设置要在存储库中注入的内容?
container.RegisterType<IBusinessRepository, BusinessRepository>(new InjectionConstructor(new ApplicationDbContext()));
在这里省略DbContext,但将其更改为:
container.RegisterType<IBusinessRepository, BusinessRepository>();
因为您已经注册了此组件,所以它将自动注入每个具有依赖关系的类的构造函数中。你的课应该是这样的:
public class BusinessRepository : IBusinessRepository
{
private ApplicationDbContext _context;
public BusinessRepository(ApplicationDbContext context)
{
this._context = context
}
}
这适用于温莎城堡。