WebApi + Simple Injector + OWIN

时间:2014-12-17 08:52:55

标签: c# asp.net-web-api asp.net-identity owin simple-injector

我正在尝试在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中的方法,但它失败并显示相同的消息。

我知道如何解决这个问题?

2 个答案:

答案 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);

感谢this post

答案 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中使用依赖注入。