unity tutorial net mvc injection dependency asp c# asp.net-web-api dependency-injection inversion-of-control castle-windsor

c# - tutorial - dependency injection web api 2



Inyección de dependencia para manipuladores y filtros en ASP.NET Web API (2)

Parece que no hay un punto de extensión a partir de hoy. Sin embargo, hay una solicitud, en http://aspnetwebstack.codeplex.com/workitem/62

Estoy intentando conectar mi proyecto Web Api para usar Castle Windsor para IoC

Lo he hecho para mis controladores siguiendo este excelente artículo .

Ahora estoy tratando de obtener dependencias inyectadas en mi DelegatingHandler y ActionFilterAttribute

Intenté copiar las técnicas utilizadas para los filtros en ASP.Net MVC regular, pero no parecen aplicarse en Web Api.

¿Alguien ha logrado que esto funcione?

No estoy seguro de cuál es el punto de extensión relevante en la API web.

He visto esto siendo sugerido

config.MessageHandlers.Add(_myContainer.Resolve<IApiUsageLogger>());

pero no estoy seguro de si hay una mejor manera. Preferiría aprovechar el mecanismo que crea estos controladores / filtros

Como huele a ubicación de servicio para muchos manipuladores. ¿Hay un solo punto que todos los controladores se crean?

¿algunas ideas?


Dado que la colección MessageHandlers es global, es efectivamente una lista de singletons. Esto está bien cuando el manejador no tiene estado ni dependencias, pero en un sistema que se basa en los principios de diseño SÓLIDO, es muy probable que esos manejadores tengan dependencias propias y es muy probable que algunas de esas dependencias necesiten un tiempo de vida que es más corto que singleton.

Si ese es el caso, dicho manejador de mensajes no debería crearse como singleton, ya que, en general, un componente nunca debería tener una vida útil que sea más larga que la duración de sus dependencias.

Sin embargo, la API web carece de enlaces que permitan resolver dicho controlador en cada solicitud, pero dicho mecanismo se crea fácilmente mediante el uso de una clase proxy:

public class DelegatingHandlerProxy<TDelegatingHandler> : DelegatingHandler where TDelegatingHandler : DelegatingHandler { private readonly WindsorContainer container; public DelegatingHandlerProxy(WindsorContainer container) { this.container = container; } protected override async Task<HttpResponseMessage> SendAsync( HttpRequestMessage request, CancellationToken cancellationToken) { // trigger the creation of the scope. request.GetDependencyScope(); var handler = this.container.Resolve<TDelegatingHandler>(); handler.InnerHandler = this.InnerHandler; var invoker = new HttpMessageInvoker(handler); var response = await invoker.SendAsync(request, cancellationToken); container.Release(handler); return response; } }

Este proxy se puede usar de la siguiente manera:

GlobalConfiguration.Configuration.MessageHandlers.Add( new DelegatingHandlerProxy<MyCustomHandler>(myContainer));

El proxy es un singleton, pero resolverá el MyCustomHandler especificado en cada solicitud.