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?