【问题标题】:How to use a single instance of DbContext , per request using Unity如何使用 Unity 的每个请求使用单个 DbContext 实例
【发布时间】:2016-03-18 22:44:48
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    我不熟悉 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
        }
    }
    

    这适用于温莎城堡。

    【讨论】:

    • 谢谢,我认为是这样,但我得到了一个未处理的异常。启用 API 跟踪后,我意识到发生了什么;还有其他类的依赖关系被破坏了。我会接受你的回答,这让我从另一个角度看待它。
    猜你喜欢
    • 1970-01-01
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    • 2012-01-04
    • 2010-11-12
    • 2015-04-16
    相关资源
    最近更新 更多