Attualmente sto utilizzando Simple Injector per risolvere le dipendenze nei miei progetti Asp.Net Web Api.Risolvi le dipendenze nell'API Web ASP.NET con Simple Injector e IHttpControllerActivator
Dalla documentazione si può configurare in quel modo:
protected void Application_Start() {
// Create the container as usual.
var container = new Container();
container.Options.DefaultScopedLifestyle = new WebApiRequestLifestyle();
// Register your types, for instance using the scoped lifestyle:
container.Register<IUserRepository, SqlUserRepository>(Lifestyle.Scoped);
// This is an extension method from the integration package.
container.RegisterWebApiControllers(GlobalConfiguration.Configuration);
container.Verify();
GlobalConfiguration.Configuration.DependencyResolver =
new SimpleInjectorWebApiDependencyResolver(container);
// Here your usual Web API configuration stuff.
}
I punti principali qui sono per registrare i controllori Web API e impostare un sistema di risoluzione delle dipendenze personalizzato.
Tuttavia Ho appena letto questi articolo di Mark Seemann su come configurare l'iniezione di dipendenza in Asp.Net Web Api:
- Dependency Injection and Lifetime Management with ASP.NET Web API
- Dependency Injection in ASP.NET Web API with Castle Windsor
Da questi articoli, ho Ho appreso che esiste un'opzione migliore rispetto all'implementazione di IDependencyResolver
per risolvere le dipendenze API Web. Questa altra opzione è creare un'implementazione di IHttpControllerActivator
che funge da adattatore sul contenitore IoC.
Qui è l'implementazione che ho codificato utilizzando SimpleInjector:
public class SimpleInjectorControllerActivator : IHttpControllerActivator
{
private readonly Container _container;
public SimpleInjectorControllerActivator(Container container)
{
_container = container;
}
public IHttpController Create(HttpRequestMessage request,
HttpControllerDescriptor controllerDescriptor, Type controllerType)
{
request.RegisterForDispose(_container.BeginExecutionContextScope());
return (IHttpController)_container.GetInstance(controllerType);
}
}
e nel metodo Application_Start
, ho sostituito questa linea:
GlobalConfiguration.Configuration.DependencyResolver =
new SimpleInjectorWebApiDependencyResolver(container);
da questa linea:
GlobalConfiguration.Configuration.Services.Replace(
typeof(IHttpControllerActivator),
new SimpleInjectorControllerActivator(container));
Mi piacerebbe sapere se l'implementazione del IHttpControllerActivator
i è valido e anche se questo approccio è valido e funzionerà buono come quello normale?
Invece di pubblicare una versione aggiornata, ho aggiornato la domanda con una versione semplificata di SimpleInjectorControllerActivator. – Steven