我正在尝试在WebAPI项目中使用带有OWIN的SimpleInjector。但是,ConfigureAuth
中的以下行失败
app.CreatePerOwinContext(container.GetInstance<ApplicationUserManager>);
例外是 ApplicationUserManager注册为&#39; Web API请求&#39;生活方式,但实例是在Web API请求的上下文之外请求的。
我在容器初始化中使用container.RegisterWebApiRequest<ApplicationUserManager>();
。 (如果我使用Register
代替RegisterWebApiRequest
,则不会有任何例外情况,但根据simple injector docs,这不是首选方法。
据我了解,ApplicationUserManager
需要使用CreatePerOwinContext
进行注册才能使OWIN正常工作。我想知道我们如何使用Simple Injector这样做,因为Simple Injector在启动期间无法解析实例。
我已经尝试了this SO answer中的方法,但它失败并显示相同的消息。
我知道如何解决这个问题?
答案 0 :(得分:13)
我使用以下代码来解决此问题。
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);
。
答案 1 :(得分:2)
您可能会发现this question有用。我们的想法是避免使用OWIN来解决依赖关系,因为它会给控制器代码带来一些混乱。以下使用OWIN解析UserManager
实例的代码是Service Locator anti-pattern:
public ApplicationUserManager UserManager
{
get
{
return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
set
{
_userManager = value;
}
}
不是依靠OWIN来解决依赖关系,而是将所需的服务注入到控制器的构造函数中,并使用IDependencyResolver
为您构建控制器。 This article演示了如何在ASP.NET Web API中使用依赖注入。