如何使用 Unity 的每个请求使用 DbContext 的单个实例
How to use a single instance of DbContext , per request using Unity
我正在重构一个项目,该项目在数据存储库中为每个方法调用创建多个 DbCOntext。
所以我希望每个 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>()));
但这给了我:
The PerRequestLifetimeManager can only be used in the context of an
HTTP request. Possible causes for this error are using the lifetime
manager on a non-ASP.NET application, or using it in a thread that is
not associated with the appropriate synchronization context.
那么如何将相同的实例注入每个存储库?
我不熟悉 Unity,但我熟悉其他各种 IoC 框架。
您为什么要设置要在存储库中注入的内容?
container.RegisterType<IBusinessRepository, BusinessRepository>(new InjectionConstructor(new ApplicationDbContext()));
此处省略 DbContext,但将其更改为:
container.RegisterType<IBusinessRepository, BusinessRepository>();
因为您已经注册了这个组件,它会自动注入到每个 class 有依赖的构造函数中。您的 class 应该如下所示:
public class BusinessRepository : IBusinessRepository
{
private ApplicationDbContext _context;
public BusinessRepository(ApplicationDbContext context)
{
this._context = context
}
}
这适用于温莎城堡。
我正在重构一个项目,该项目在数据存储库中为每个方法调用创建多个 DbCOntext。 所以我希望每个 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>()));
但这给了我:
The PerRequestLifetimeManager can only be used in the context of an HTTP request. Possible causes for this error are using the lifetime manager on a non-ASP.NET application, or using it in a thread that is not associated with the appropriate synchronization context.
那么如何将相同的实例注入每个存储库?
我不熟悉 Unity,但我熟悉其他各种 IoC 框架。
您为什么要设置要在存储库中注入的内容?
container.RegisterType<IBusinessRepository, BusinessRepository>(new InjectionConstructor(new ApplicationDbContext()));
此处省略 DbContext,但将其更改为:
container.RegisterType<IBusinessRepository, BusinessRepository>();
因为您已经注册了这个组件,它会自动注入到每个 class 有依赖的构造函数中。您的 class 应该如下所示:
public class BusinessRepository : IBusinessRepository
{
private ApplicationDbContext _context;
public BusinessRepository(ApplicationDbContext context)
{
this._context = context
}
}
这适用于温莎城堡。