Simple Injector не удается внедрить для каждого зарегистрированного класса запроса веб-API при запуске Owin
Я создаю API, используя Owin, Web API, Entity Framework, ASP.NET Identity. я используюПростой инжектор в качестве моей DI рамки выбора.
В процессе запуска Owin я хочу заполнить свою базу данных некоторыми примерами данных. Это обрабатывается классом, реализующимIDatabaseInitializer
, который выглядит примерно так:
public class MyDbInitializer : DropCreateDatabaseAlways<MyDataContext>
{
private readonly IUserManager _userManager;
public MyDbInitializer(IUserManager userManager)
{
_userManager = userManager;
}
protected override void Seed(MyDataContext context)
{
SeedIdentities();
}
private void SeedIdentities()
{
var user = new User
{
UserName = "someUsername",
Email = "[email protected]"
};
_userManager.CreateAsync(user, "Password");
}
IUserManager
такое прокси для ASP.NET IdentiyUserManager
класс, который косвенно зависит отIUnitOfWork
, Если вам интересно,IUserManager
регистрируется так:
container.Register(typeof(IUserManager),
() => container.GetInstance<IUserManagerFactory>().Create());
Поскольку я хочу использовать одну единицу работы на запрос веб-API, я зарегистрировал свойIUnitOfWork
следующим образом:
container.RegisterWebApiRequest<IUnitOfWork, MyUnitOfWork>();
Это работает отлично и денди для всего, кроме как при разрешенииIUserManager
зависимость вMyDbInitializer
учебный класс. Во время запуска приложения SimpleInjector завершается ошибкой со следующим ActivationException:
SimpleInjector.ActivationException was unhandled by user code
HResult=-2146233088
Message=The registered delegate for type IUserManagerFactory threw an exception. The IUnitOfWork is registered as 'Web API Request' lifestyle, but the instance is requested outside the context of a Web API Request.
Source=SimpleInjector
StackTrace:
at SimpleInjector.InstanceProducer.GetInstance()
at SimpleInjector.Container.GetInstance[TService]()
at Project.WebApi.CompositionRoot.SimpleInjectorCompositionRoot.<RegisterSecurityDependencies>b__c() in c:\code\Project\Project.WebApi\CompositionRoot\SimpleInjectorCompositionRoot.cs:line 130
at lambda_method(Closure )
at lambda_method(Closure )
at SimpleInjector.InstanceProducer.GetInstance()
InnerException: SimpleInjector.ActivationException
HResult=-2146233088
Message=The IUnitOfWork is registered as 'Web API Request' lifestyle, but the instance is requested outside the context of a Web API Request.
Source=SimpleInjector
StackTrace:
at SimpleInjector.Scope.GetScopelessInstance[TService,TImplementation](ScopedRegistration`2 registration)
at SimpleInjector.Scope.GetInstance[TService,TImplementation](ScopedRegistration`2 registration, Scope scope)
at SimpleInjector.Advanced.Internal.LazyScopedRegistration`2.GetInstance(Scope scope)
at lambda_method(Closure )
at SimpleInjector.InstanceProducer.GetInstance()
InnerException:
Я думаю, что ОуэнStartup.cs
класс рассматривается как находящийся вне жизненного цикла запроса Web API, и это внедрение конструктора в инициализаторе базы данных завершается неудачно, потому что он вызываетсяStartup.cs
учебный класс.
Я не уверен, как решить эту проблему. Должен ли я использовать гибридный образ жизни для регистрацииIUnitOfWork
или есть лучшее решение?