如何使用Unity的每个请求使用单个DbContext实例

时间:2016-03-18 22:44:48

标签: asp.net-mvc inversion-of-control unity-container

我正在重构一个项目,该项目在数据存储库中为每个方法调用创建多个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应用程序上的管理器,或者在一个线程中使用它   与适当的同步上下文无关。

那么如何将相同的实例注入每个存储库?

1 个答案:

答案 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
    }
}

这适用于温莎城堡。