如果从项目中删除DI库,使用owin、webapi、mvc和DI (SimpleInjector)的新的SimpleInjector mvc项目运行良好。然而,一旦引入,应用程序在注册DI的OWIN组件时就会崩溃。我们正在命中OWIN启动配置,并在没有错误的情况下运行,但是当需要注册依赖项时(下面列出),我将收到以下错误:
“System.InvalidOperationException”类型的异常发生在Microsoft.Owin.Host.SystemWeb.dll中,但未在用户代码中处理 附加信息:在上下文中没有找到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>();
更新-全堆栈跟踪
(在System.Web.HttpContextBaseExtensions.GetOwinContext(HttpContextBase context)在WebApplication1.App_Start.SimpleInjectorInitializer.<>c__DisplayClass6.b__2() in b:\temp\WebApplication1\WebApplication1\App_Start\SimpleInjectorInitializer.cs:line 41 at lambda_method(关闭) SimpleInjector.Scope.CreateAndCacheInstanceTService,TImplementation at SimpleInjector.Scope.GetInstanceTService,TImplementation at SimpleInjector.Scope.GetInstanceTService,TImplementation at SimpleInjector.Advanced.Internal.LazyScopedRegistration`2.GetInstance(Scope scope)_method(闭包)在SimpleInjector.InstanceProducer.GetInstance()
发布于 2015-01-19 22:09:39
我认为当您调用Verify()
时会引发异常。可能在该行中,但只在调用委托时。
简单注入器允许以任何顺序进行注册,因此不会验证注册依赖项的存在性和正确性。这个验证是在第一次请求实例时完成的,或者可以通过在注册过程结束时调用.Verify()
来触发。
我怀疑你注册OwinContext
只是因为你需要它来获得IAuthenticationManager
。
您面临的问题是,只有当存在OwinContext
时,HttpContext
才可用。在组合根目录中构建应用程序时,此上下文不可用。您需要的是一个委托,它检查应用程序的阶段并返回与此阶段匹配的组件。您可以通过将IAuthenticationManager
注册为:
container.RegisterPerWebRequest<IAuthenticationManager>(() =>
AdvancedExtensions.IsVerifying(container)
? new OwinContext(new Dictionary<string, object>()).Authentication
: HttpContext.Current.GetOwinContext().Authentication);
当代码在“正常运行时阶段”运行并且有一个IAuthenticationManager
时,委托将返回自带控制的HttpContext
。
但是在显式调用Verify()
时(这是高度可取的的操作!)注册过程结束时,不存在HttpContext
。因此,我们将在验证容器期间创建一个新的OwinContext
,并从这个新创建的OwinContext
返回身份验证组件。但前提是容器确实在验证!
如注释中已经提到的,可以阅读完整而详细的描述这里。
发布于 2017-03-01 11:17:19
“Ric.Net”的回答为我指出了正确的方向,但要允许更改新的SimpleInjector,必须按以下方式更改代码(因为RegisterPerWebRequest是明显的):
container.Register<IAuthenticationManager>(() => AdvancedExtensions.IsVerifying(container)
? new OwinContext(new Dictionary<string, object>()).Authentication
: HttpContext.Current.GetOwinContext().Authentication, Lifestyle.Scoped);
此外,必须向容器中添加以下两个注册,以便“container.Verify()”能够正确工作:
container.Register<ApplicationUserManager>(Lifestyle.Scoped);
container.Register<ApplicationSignInManager>(Lifestyle.Scoped);
https://stackoverflow.com/questions/27908388
复制相似问题