Aktualnie używam Simple Injector do rozwiązywania zależności w moich projektach Asp.Net Web Api.Rozwiązywanie zależności w interfejsie API ASP.NET Web z prostym wtryskiwaczem i mechanizmem IHttpControllerActivator
Z dokumentacji można skonfigurować go tak:
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.
}
Główne punkty są tu zarejestrować kontrolerów api WWW i ustawić resolverowi zwyczaj zależność.
Jednak mam tylko czytać te artykuł z Mark Seemann, w jaki sposób skonfigurować iniekcji zależność w ASP.NET Web API:
- Dependency Injection and Lifetime Management with ASP.NET Web API
- Dependency Injection in ASP.NET Web API with Castle Windsor
z takich wyrobów, I dowiedziałem się, że istnieje lepsza opcja niż implementacja IDependencyResolver
w celu rozwiązania zależności Web Api. Ta druga opcja polega na utworzeniu implementacji IHttpControllerActivator
, która działa jako adapter w stosunku do kontenera IoC.
Oto implementacja mam zakodowane przy użyciu 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);
}
}
iw sposobie Application_Start
, mam wymienić tę linię:
GlobalConfiguration.Configuration.DependencyResolver =
new SimpleInjectorWebApiDependencyResolver(container);
przez tę linię:
GlobalConfiguration.Configuration.Services.Replace(
typeof(IHttpControllerActivator),
new SimpleInjectorControllerActivator(container));
Chciałbym wiedzieć, czy wdrożenie IHttpControllerActivator
i s ważne, a także czy to podejście jest prawidłowe i będzie działało tak dobrze, jak normalne?
Zamiast publikować zaktualizowaną wersję, zaktualizowałem Twoje pytanie za pomocą uproszczonej wersji SimpleInjectorControllerActivator. – Steven