O Injetor Simples falha ao injetar por classe registrada de solicitação da API da Web durante a inicialização do Owin

Estou criando uma API usando Owin, Web API, Entity Framework, ASP.NET Identity. estou a usarInjetor Simples como minha estrutura de DI preferida.

Durante o processo de inicialização do Owin, quero propagar meu banco de dados com alguns dados de amostra. Isso é tratado por uma classe implementandoIDatabaseInitializer, que se parece com isso:

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 é um proxy para a identificação do ASP.NETUserManager classe, que depende indiretamente deIUnitOfWork. Caso você esteja se perguntando,IUserManager é registrado assim:

container.Register(typeof(IUserManager), 
    () => container.GetInstance<IUserManagerFactory>().Create());

Como quero usar uma única unidade de trabalho por solicitação da API da Web, registrei meuIUnitOfWork como segue:

container.RegisterWebApiRequest<IUnitOfWork, MyUnitOfWork>();

Isso está funcionando bem e com qualidade para tudo, exceto ao resolver o problema.IUserManager dependência noMyDbInitializer classe. Durante a inicialização do aplicativo, o SimpleInjector falha com a seguinte 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:

Eu acho que o OwinStartup.cs A classe é considerada fora do ciclo de vida da solicitação da API da Web e a injeção do construtor no inicializador do banco de dados falha porque é chamada peloStartup.cs classe.

Não tenho certeza de como resolver esse problema. Devo usar um estilo de vida híbrido para o registro deIUnitOfWork, ou existe alguma solução melhor?

questionAnswers(2)

yourAnswerToTheQuestion