Simple Injector kann beim Start von Owin keine pro Web-API-Anforderung registrierte Klasse injizieren

Ich erstelle eine API mit Owin, Web API, Entity Framework und ASP.NET Identity. Ich benutzeEinfacher Injektor als mein DI-Framework der Wahl.

Während des Startvorgangs von Owin möchte ich meiner Datenbank einige Beispieldaten hinzufügen. Dies wird von einer Klassenimplementierung erledigtIDatabaseInitializer, was ungefähr so aussieht:

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 ist ein Proxy für die ASP.NET-IdentitätUserManager Klasse, die indirekt abhängtIUnitOfWork. Falls Sie sich fragen,IUserManager ist so registriert:

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

Da ich eine einzelne Arbeitseinheit pro Web-API-Anforderung verwenden möchte, habe ich my registriertIUnitOfWork wie folgt:

container.RegisterWebApiRequest<IUnitOfWork, MyUnitOfWork>();

Dies funktioniert einwandfrei und einwandfrei für alles außer bei der Lösung des ProblemsIUserManager Abhängigkeit in derMyDbInitializer Klasse. Während des Anwendungsstarts schlägt SimpleInjector mit der folgenden ActivationException fehl:

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:

Ich denke, dass der OwinStartup.cs Die Klasse wird als außerhalb des Lebenszyklus der Web-API-Anforderung befindlich angesehen, und die Konstruktorinjektion im Datenbankinitialisierer schlägt fehl, weil sie vom aufgerufen wirdStartup.cs Klasse.

Ich bin nicht sicher, wie ich dieses Problem lösen soll. Sollte ich einen hybriden Lebensstil für die Registrierung von verwenden?IUnitOfWork, oder gibt es eine bessere lösung?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage