WebApi + Simple Injector + OWIN

ε祈祈猫儿з 提交于 2019-11-30 08:02:10

问题


I am trying to use SimpleInjector with OWIN in a WebAPI project. However, the following line in ConfigureAuth fails

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

The exception is The ApplicationUserManager is registered as 'Web API Request' lifestyle, but the instance is requested outside the context of a Web API Request.

I am using container.RegisterWebApiRequest<ApplicationUserManager>(); in container initialization. (there won't be any exceptions if I use Register instead of RegisterWebApiRequestbut this is not the preferred method as per simple injector docs)

As I understand, ApplicationUserManager needs to be registered using CreatePerOwinContext for OWIN to work properly. I wonder how do we do this using Simple Injector given that Simple Injector cannot resolve instances during startup.

I have already tried the method in this SO answer but it fails with the same message.

Any idea how can I resolve this?


回答1:


I used the following code to solve this issue.

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();
     }
});
}

and then called app.UseOwinContextInjector(container); right after registering the dependancies.

Thanks to this post




回答2:


You may find this question useful. The idea is to avoid using OWIN to resolve dependencies because it introduces some clutter to your controllers code. The following code that uses OWIN to resolve UserManager instance is a Service Locator anti-pattern:

public ApplicationUserManager UserManager
{
    get
    {
        return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();                
    }
    set
    {
        _userManager = value;
    }
}

Instead of relying on OWIN to resolve dependencies, inject required services into your controller's constructor and use IDependencyResolver to build controller for you. This article demonstrates how to use dependency injection in ASP.NET Web API.



来源:https://stackoverflow.com/questions/27521558/webapi-simple-injector-owin

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!