首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ASP.NET MVC 5+ Owin + SimpleInjector

ASP.NET MVC 5+ Owin + SimpleInjector
EN

Stack Overflow用户
提问于 2015-01-12 18:25:11
回答 2查看 4.6K关注 0票数 2

如果从项目中删除DI库,使用owin、webapi、mvc和DI (SimpleInjector)的新的SimpleInjector mvc项目运行良好。然而,一旦引入,应用程序在注册DI的OWIN组件时就会崩溃。我们正在命中OWIN启动配置,并在没有错误的情况下运行,但是当需要注册依赖项时(下面列出),我将收到以下错误:

“System.InvalidOperationException”类型的异常发生在Microsoft.Owin.Host.SystemWeb.dll中,但未在用户代码中处理 附加信息:在上下文中没有找到owin.Environment项。

SimpleInjector注册代码:

代码语言:javascript
运行
复制
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()

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-19 22:09:39

我认为当您调用Verify()时会引发异常。可能在该行中,但只在调用委托时。

简单注入器允许以任何顺序进行注册,因此不会验证注册依赖项的存在性和正确性。这个验证是在第一次请求实例时完成的,或者可以通过在注册过程结束时调用.Verify()来触发。

我怀疑你注册OwinContext只是因为你需要它来获得IAuthenticationManager

您面临的问题是,只有当存在OwinContext时,HttpContext才可用。在组合根目录中构建应用程序时,此上下文不可用。您需要的是一个委托,它检查应用程序的阶段并返回与此阶段匹配的组件。您可以通过将IAuthenticationManager注册为:

代码语言:javascript
运行
复制
container.RegisterPerWebRequest<IAuthenticationManager>(() => 
    AdvancedExtensions.IsVerifying(container) 
        ? new OwinContext(new Dictionary<string, object>()).Authentication 
        : HttpContext.Current.GetOwinContext().Authentication); 

当代码在“正常运行时阶段”运行并且有一个IAuthenticationManager时,委托将返回自带控制的HttpContext

但是在显式调用Verify()时(这是高度可取的的操作!)注册过程结束时,不存在HttpContext。因此,我们将在验证容器期间创建一个新的OwinContext,并从这个新创建的OwinContext返回身份验证组件。但前提是容器确实在验证!

如注释中已经提到的,可以阅读完整而详细的描述这里

票数 15
EN

Stack Overflow用户

发布于 2017-03-01 11:17:19

“Ric.Net”的回答为我指出了正确的方向,但要允许更改新的SimpleInjector,必须按以下方式更改代码(因为RegisterPerWebRequest是明显的):

代码语言:javascript
运行
复制
        container.Register<IAuthenticationManager>(() => AdvancedExtensions.IsVerifying(container)
                    ? new OwinContext(new Dictionary<string, object>()).Authentication
                    : HttpContext.Current.GetOwinContext().Authentication, Lifestyle.Scoped);

此外,必须向容器中添加以下两个注册,以便“container.Verify()”能够正确工作:

代码语言:javascript
运行
复制
        container.Register<ApplicationUserManager>(Lifestyle.Scoped);
        container.Register<ApplicationSignInManager>(Lifestyle.Scoped);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27908388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档