Unity PerRequestLifetimeManager在RegisterTypes()方法中的Web API应用程序中抛出异常

时间:2018-05-13 21:45:50

标签: asp.net entity-framework asp.net-web-api asp.net-web-api2 unity-container

我在我的Web API应用程序中配置Unity以注入依赖项,但是当我尝试使用PerRequestLifetimeManager注册DbContext时它会引发异常。 如果我使用默认的LifeTimeManager ,它可以正常工作。我将Unity.MVC和Unity.Webapi nuget包添加到应用程序中。这是RegisterTypes的代码。

container                
.AddNewExtension<Interception>()                
.RegisterType(typeof(DbContext), typeof(MyDbContext), "MyContext", new PerRequestLifetimeManager())                
.RegisterType(typeof(IRepository<Country>), typeof(Repository<Country>), new InjectionConstructor(container.Resolve(typeof(DbContext),"MyContext")))                
.RegisterType(typeof(IRepository<Region>), typeof(Repository<Region>), new InjectionConstructor(container.Resolve(typeof(DbContext), "MyContext")))

当我运行应用程序时,它会在RegisterTypes中抛出以下异常。

  

... Unity.Exceptions.ResolutionFailedException

     

内部异常1:InvalidOperationException:The   PerRequestLifetimeManager只能在HTTP的上下文中使用   请求。此错误的可能原因是使用生命周期管理器   在非ASP.NET应用程序上,或在非线程中使用它   与适当的同步上下文相关联。

知道我在这里做错了吗?

1 个答案:

答案 0 :(得分:0)

我明白了。就像错误消息所说的那样,我试图在应用程序初始化时在非Http Request上下文中注入DbContext。如果我按照下面的说明进行操作,它可以正常工作,而无需尝试配置&#34; InjectionConstructor&#34;在RegisterType for Repositories中。它成功地在每个请求的存储库中注入一个新的DbContext实例。似乎您不能将注入使用的注入类型注入到#34; PerRequestLifetimeManager&#34;。

 container                
.AddNewExtension<Interception>()                
.RegisterType(typeof(DbContext), typeof(MyDbContext), "MyContext", new PerRequestLifetimeManager())                
.RegisterType(typeof(IRepository<Country>), typeof(Repository<Country>))                
.RegisterType(typeof(IRepository<Region>), typeof(Repository<Region>))