如何使用 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
    }
}

这适用于温莎城堡。