Simple Injector no puede inyectar por clase registrada de solicitud de API web durante el inicio de Owin
Estoy creando una API usando Owin, Web API, Entity Framework, ASP.NET Identity. Estoy usandoInyector simple como mi marco DI de elección.
Durante el proceso de inicio de Owin, quiero sembrar mi base de datos con algunos datos de muestra. Esto es manejado por una clase que implementaIDatabaseInitializer
, que se parece a esto:
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
es un proxy para la identidad ASP.NETUserManager
clase, que indirectamente depende deIUnitOfWork
. En caso de que te lo estés preguntando,IUserManager
está registrado así:
container.Register(typeof(IUserManager),
() => container.GetInstance<IUserManagerFactory>().Create());
Como quiero usar una sola unidad de trabajo por solicitud de API web, he registrado miIUnitOfWork
de la siguiente manera:
container.RegisterWebApiRequest<IUnitOfWork, MyUnitOfWork>();
Esto funciona bien y dandy para todo excepto al resolver elIUserManager
dependencia en elMyDbInitializer
clase. Durante el inicio de la aplicación, SimpleInjector falla con la siguiente 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:
Supongo que el OwinStartup.cs
se considera que la clase está fuera del ciclo de vida de la solicitud de la API web, y la inyección del constructor en el inicializador de la base de datos falla porque es invocada porStartup.cs
clase.
No estoy seguro de cómo resolver este problema. ¿Debo usar un estilo de vida híbrido para el registro deIUnitOfWork
¿O hay alguna solución mejor?