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или есть лучшее решение?

Ответы на вопрос(2)

Ваш ответ на вопрос