2014-12-17 2 views
12

Я пытаюсь использовать SimpleInjector с OWIN в проекте WebAPI. Однако, следующая строка в ConfigureAuth не удаетсяWebApi + Simple Injector + OWIN

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

Исключение составляет ApplicationUserManager зарегистрирован как «Web API Request» образ жизни, но экземпляр запрашивается вне контекста Web API запроса.

Я использую container.RegisterWebApiRequest<ApplicationUserManager>(); в инициализации контейнера. (Там не будет каких-либо исключений, если я использую Register вместо RegisterWebApiRequest, но это не является предпочтительным способом согласно simple injector docs)

Как я понимаю, ApplicationUserManager должен быть зарегистрирован с помощью CreatePerOwinContext для Owin, чтобы работать должным образом. Интересно, как мы это делаем, используя Simple Injector, учитывая, что Simple Injector не может разрешать экземпляры во время запуска.

Я уже пробовал метод в this SO answer, но он не работает с тем же сообщением.

Любая идея, как я могу это решить?

ответ

12

Я использовал следующий код для решения этой проблемы.

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

+4

У вас есть полный пример где-то посмотреть, я пытаюсь сделать что-то очень похожее, но я также использую IdentityServer3, обработчик - атрибут для управления версиями. – OutOFTouch

+0

Можете ли вы представить полный пример для Owin + MVC + SimpleInjector? – Jerome2606

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.

+1

Спасибо. Я не использую OWIN для разрешения зависимостей. OWIN внутренне использует ApplicationUserManager и пытается получить это из OwinContext. Поэтому включение OWIN в экземпляр ApplicationUserManager обязательно для работы OWIN (пожалуйста, поправьте меня, если я ошибаюсь). Я не использую код, который вы указали в AccountController. AccountController получает ApplicationUserManager через инъекцию конструктора. Таким образом, проблема остается. – su8898

+1

@ su8898, то я бы порекомендовал вам взглянуть на [этот пост в блоге] (http://tech.trailmax.info/2014/09/aspnet-identity-and-ioc-container-registration/) - может быть, Здесь вы найдете полезные примеры кода. –

+0

В примерах в сообщении для блога используйте 'app.CreatePerOwinContext (() => DependencyResolver.Current.GetService ());' in _ConfigureAuth_, потому что это проект MVC. WebAPI имеет другую реализацию для DependancyResolver. Даже если мы будем использовать такой метод, я думаю, что он потерпит неудачу, потому что SimpleInjector не сможет решить 'ApplicationUserManager' в _ConfigureAuth_. Мне интересно, как мне решить эту проблему? – su8898

Смежные вопросы