Post de la serie:

Hola, en los dos post anteriores de la serie sobre Microsoft Unity, vimos para que nos sirve la Inyección de dependencias y cómo podemos iniciar rápidamente con Unity como contenedor, sin embargo no entramos en detalle sobre el proceso de registro de depedencias, así que vamos a hablar sobre esa parte; existen dos métodos ofrecidos por Unity para realizar el registro/mapeo de las dependencias, RegisterType y RegisterInstance, en este post vamos a revisar RegisterType:

RegisterType

RegisterType es la forma más sencilla (y en mi opinión utilizada) para realizar el mapeo generalmente entre interfaz -> tipo concreto, la sintaxis básica de RegisterType es:

container.RegisterType();

Luego para resolver la dependencia:

container.Resolve();

Ahora, es posible asignar un nombre al mapping que se crea, la sintaxis en ese caso es:

container.RegisterType("RegistrationName");

y para resolver la dependencia:

container.Resolve("RegistrationName");

También es posible especificar el tiempo de vida de la dependencia, es decir el manejo que se le va a dar cuando la instancia es creada hasta que es liberada, por ejemplo si se quiere que la instancia registrada sea tipo Singleton podemos utilizar un tiempo de vida ContainerControlledLifetimeManager, el manejador de tiempo de vida por defecto es TransientLifetimeManager cuyo comportamiento es que se crea una instancia nueva cada vez que se hace uso del método Resolve, para registrar el contenedor con un manejador de tiempo de vida utilizamos la siguiente sintaxis:

container.Resolve("RegistrationName", LifetimeManager()); o container.Resolve(LifetimeManager());

La siguiente imagen nos ayuda a aclarar el tema:

lifetimemanager

Otra característica bastante útil, es que podemos registrar dependencias por convención y así ahorrarnos el estar registrando cada una de las dependencias por separado, por ejemplo podemos crear un registro por convención para registrar dependencias automáticamente cuando la clase concreta tiene asociada una interfaz con el mismo nombre, por ejemplo, tenemos un controlador que recibe tres (pueden ser más) parámetros en su constructor:

public class HomeController : Controller { private readonly ILog log; private readonly IService service; private readonly IManager manager; public HomeController(ILog log, IService service, IManager manager) { this.log = log; this.service = service; this.manager = manager; } public ActionResult Index() { log.Log("Action: Index"); return View(); } }

Y en este caso, el tipo concreto tiene el mismo nombre que la interfaz excepto que su nombre no tiene la I:

machinginterface

Entonces para ahórranos tiempo registrando una a una cada dependencia, podemos aplicar el registro por convenciones, que para este caso quedaría:

container.RegisterTypes( AllClasses.FromAssemblies(typeof(MvcApplication).Assembly), WithMappings.FromMatchingInterface, WithName.Default, WithLifetime.ContainerControlled );

Dale una revisada al post del crack @jmaguilar: Convenciones en Unity 3

Espero el post les haya gustado, en el siguiente post de la seria vamos a ver cómo usamos RegisterInstace.

Y no te olvides de compartir el post!