我正在尝试在WebAPI项目中将SimpleInjector与OWIN一起使用。但是,ConfigureAuth
中的以下行失败
app.CreatePerOwinContext(container.GetInstance<ApplicationUserManager>);
例外情况是应用程序用户管理器注册为"Web API 请求"生活方式,但实例是在 Web API 请求的上下文之外请求的。
我在容器初始化中使用container.RegisterWebApiRequest<ApplicationUserManager>();
。(如果我使用 Register
而不是 RegisterWebApiRequest
,不会有任何例外,但根据简单的注射器文档,这不是首选方法)
据我了解,ApplicationUserManager
需要使用CreatePerOwinContext
进行注册才能使 OWIN 正常工作。我想知道我们如何使用简单注入器来做到这一点,因为简单注入器无法在启动期间解析实例。
我已经尝试了此SO答案中的方法,但是它失败并显示相同的消息。
知道我该如何解决这个问题吗?
我使用以下代码来解决此问题。
public static void UseOwinContextInjector(this IAppBuilder app, Container container)
{
// Create an OWIN middleware to create an execution context scope
app.Use(async (context, next) =>
{
using (var scope = container.BeginExecutionContextScope())
{
await next.Invoke();
}
});
}
然后在注册依赖项后立即调用app.UseOwinContextInjector(container);
。
感谢这篇文章
发现这个问题很有用。这个想法是避免使用 OWIN 来解决依赖项,因为它会给控制器代码带来一些混乱。以下使用 OWIN 解析实例的代码UserManager
服务定位器反模式:
public ApplicationUserManager UserManager
{
get
{
return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
set
{
_userManager = value;
}
}
不要依赖 OWIN 来解决依赖项,而是将所需的服务注入控制器的构造函数,并使用IDependencyResolver
为你生成控制器。本文演示如何在 Web API 中使用依赖项注入 ASP.NET。