sábado, 17 de enero de 2015

Asp.Net WebApi: IOC, IdependencyResolver, N Tiers

A partir de la versión 2 del producto asp.net web api incorpora IdependyResolver. Esta interfaz nos permite realizar una implementación personalizada de un DependencyResolver y asignarlo a la configuración de la API.

Esto facilita usar un contenedor IOC en este tipo de proyectos implementando un dependency resolver. Hasta ahora los fabricantes de IOC tenían que proporcionar algun tipo de sistema para que el contenedor persistiese en el ciclo de vida de la aplicación web y se integrase en el pipeline de las peticiones para así poder inyectar los tipos necesarios al instanciar controladores.

Ahora podríamos implementar nuestro DependencyResolver usando un IOC container de terceros y asignarlo a la configuración de la api, de este modo es el mismo framework web api el que se encarga de gestionar la inyección de dependencia con ayuda del resolver.

Os paso un articulo donde está explicado como implementar la inyección de dependencia en controladores en una web api con unity. Aquí usan UnityResolver que puedes descargar de nuget.

Asp.net -> Dependency Injection

Este sistema, por defecto, propone registrar las dependencias de modo programático. Has de tener en cuenta que si la web api es la punta del iceberg de una arquitectura N Tier con varios niveles como una DDD podrías llegar a tener alguna limitación con este sistema que se plantea.

En una arquitectura de este tipo la api tendrá acceso a una capa de negocio y la capa de negocio tendrá acceso a una capa de datos.



Desde la api no tendrás acceso a la capa de datos, o no deberías!!. Si la configuración de las dependencias se está llevando desde el archivo webapiconfig.cs, allí necesitarás registrar el tipo explícitamente en el contenedor IOC (...) ¿Qué pasa si quieres registrar un tipo en el contenedor que pertenece a la capa de datos? Mírate este artículo, propone hacerlo con MEF y explica los pasos para hacerlo. Lo tengo implementado y funciona OK.

Developer.com -> Depedency Injenction Best Practices in an N Tier modular Application

En resumen, con este sistema que se plantea tendrías la configuración organizada de este modo:

WebApiConfig.cs -> public static void Register(HttpConfiguration config)
   //IOC
    var container = new UnityContainer();
    ModuleLoader.LoadContainer(container, ".\\bin", "areaTIC.*.dll");
    container.RegisterType<IGenericFacade<User>, GenericFacade<User>>();
    config.DependencyResolver = new UnityResolver(container);
ModuleInit.cs -> (tenemos un ModuleInit en cada nivel, aquí business)
    [Export(typeof(IModule))]
    public class ModuleInit : IModule
    {
        public void Initialize(IModuleRegisterType iocContainer)
        {
            //register types here.
            iocContainer.RegisterType<IGenericRepository<User>, GenericRepository<User>>();
        }
    }
En este ejemplo he usado Unity pero podrías usar otros, te paso una serie de artículos interesantes a modo de comparativa que podrían ayudarte en un momento determinado a escoger fabricante de IOC:

ElegantCode -> Comparativa IOC
Curah -> Unity Vs other IOC Containers

Espero os resulte útil el post, cualquier debate, apreciación, duda y demás ya sabes que puedes hacérnosla llegar a través de comentarios o redes sociales. Hasta la próxima!