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, но он не работает с тем же сообщением.
Любая идея, как я могу это решить?
Ответы
Ответ 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.