WebApi + Simple Injector + OWIN

本文关键字:OWIN Injector Simple WebApi | 更新日期: 2023-09-27 18:34:24

我正在尝试在WebAPI项目中将SimpleInjector与OWIN一起使用。但是,ConfigureAuth中的以下行失败

app.CreatePerOwinContext(container.GetInstance<ApplicationUserManager>);

例外情况是应用程序用户管理器注册为"Web API 请求"生活方式,但实例是在 Web API 请求的上下文之外请求的。

我在容器初始化中使用container.RegisterWebApiRequest<ApplicationUserManager>();。(如果我使用 Register 而不是 RegisterWebApiRequest,不会有任何例外,但根据简单的注射器文档,这不是首选方法)

据我了解,ApplicationUserManager需要使用CreatePerOwinContext进行注册才能使 OWIN 正常工作。我想知道我们如何使用简单注入器来做到这一点,因为简单注入器无法在启动期间解析实例。

我已经尝试了此SO答案中的方法,但是它失败并显示相同的消息。

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

WebApi + Simple Injector + OWIN

我使用以下代码来解决此问题。

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。