bbq*_*bot 2 c# asp.net-mvc dependency-injection simple-injector owin
如果我从项目中删除DI lib,使用owin,webapi,mvc和DI(SimpleInjector)的新asp.net mvc项目运行正常.然而,一旦推出,在注册DI的OWIN组件时应用程序就会爆炸.OWIN启动配置正在被命中并且运行没有错误,但是当需要注册依赖项时(如下所示),我收到以下错误:
Microsoft.Owin.Host.SystemWeb.dll中出现"System.InvalidOperationException"类型的异常,但未在用户代码中处理
附加信息:在上下文中找不到owin.Environment项.
SimpleInjector注册码:
container.RegisterPerWebRequest<IUserStore<ApplicationUser>>(() => new UserStore<ApplicationUser>());
container.RegisterPerWebRequest<HttpContextBase>(() => new HttpContextWrapper(HttpContext.Current));
// app fails on call to line below...
container.RegisterPerWebRequest(() => container.GetInstance<HttpContextBase>().GetOwinContext());
container.RegisterPerWebRequest(() => container.GetInstance<IOwinContext>().Authentication);
container.RegisterPerWebRequest<DbContext, ApplicationDbContext>();
Run Code Online (Sandbox Code Playgroud)
更新 - 完整堆栈跟踪
在WebApplication1.App_Start.SimpleInjectorInitializer的System.Web.HttpContextBaseExtensions.GetOwinContext(HttpContextBase context)中.<> c__DisplayClass6.b__2()在b:\ temp\WebApplication1\WebApplication1\App_Start\SimpleInjectorInitializer.cs:第41行在lambda_method(Closure)at SimpleInjector.Scope.CreateAndCacheInstance [TService,TImplementation](ScopedRegistration
2 registration) at SimpleInjector.Scope.GetInstance[TService,TImplementation](ScopedRegistration2 registration),位于SimpleInjector.Scope.GetInstance [TService,TImplementation](ScopedRegistration2 registration, Scope scope) at SimpleInjector.Advanced.Internal.LazyScopedRegistration2.GetInstance(范围范围),位于SimpleInjector.InstanceProducer.GetInstance()的lambda_method(Closure)
Ric*_*Net 15
我认为你打电话时会抛出异常Verify().可能在那一行,但只有当代表被召唤时.
Simple Injector允许以任何顺序进行注册,因此不会验证注册依赖项的存在性和正确性.此验证在第一次请求实例时完成,或者可以.Verify()在注册过程结束时通过调用触发.
我怀疑你OwinContext只是注册了,因为你需要它来获得IAuthenticationManager.
你遇到的问题是,OwinContext只有当有一个时,它才可用HttpContext.在组合根中构建应用程序时,此上下文不可用.您需要的是一个委托,它检查应用程序的阶段并返回与此阶段匹配的组件.你可以通过注册IAuthenticationManageras:
container.RegisterPerWebRequest<IAuthenticationManager>(() =>
AdvancedExtensions.IsVerifying(container)
? new OwinContext(new Dictionary<string, object>()).Authentication
: HttpContext.Current.GetOwinContext().Authentication);
Run Code Online (Sandbox Code Playgroud)
IAuthenticationManager当代码在"正常运行时阶段"运行时,委托将返回受控的Owin,并且有一个HttpContext.
但是在注册过程结束时进行显式调用Verify()(这是非常可取的!)则没有HttpContext.因此,我们将OwinContext在验证容器期间创建一个新的,并从新创建的组件返回Authentication组件OwinContext.但只有当容器确实在验证时!
如评论中已经提到的,可以在此处阅读完整详细的描述.
| 归档时间: |
|
| 查看次数: |
4173 次 |
| 最近记录: |