Подтвердить что ты не робот

WebApi + Простой инжектор + OWIN

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

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

Исключение: ApplicationUserManager зарегистрирован как стиль веб-API Request, но экземпляр запрашивается вне контекста запроса веб-API.

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

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

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

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

4b9b3361

Ответ 1

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

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); сразу после регистрации зависимостей.

Благодаря этому сообщению

Ответ 2

Вы можете найти этот вопрос полезным. Идея состоит в том, чтобы избежать использования OWIN для разрешения зависимостей, поскольку он вводит некоторый беспорядок в код вашего контроллера. Следующий код, который использует OWIN для разрешения экземпляра UserManager, представляет собой антивирусное средство Locator > :

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

Вместо того, чтобы полагаться на OWIN для разрешения зависимостей, введите требуемые службы в свой конструктор контроллера и используйте IDependencyResolver для создания контроллера для вас. В этой статье демонстрируется использование инъекции зависимостей в веб-API ASP.NET.