24 dic 2010

Unity - Pasar cadenas de conexión al constructor

Actualmente me encuentro desarrollando la arquitectura de un sistema orientado al dominio (Domain Driven Design), bajo C# en Visual Studio 2010, utilizando el nuevo Entity Framework 4. Estoy utilizando Unity como resolvedor e inyectador de dependencias. Ahora bien, como expliqué en posts pasados, utilicé las plantillas T4 para generar mis entidades y mi contexto de conexión. Estaba trabajando instanciando en cada consulta al contexto que me generaba el EF. Cuando hablo de contexto, me refiero a la clase parcial cuyo nombre lo toma en base al nombre que ingresamos cuando hicimos click en [Add Code Generation Item...].
Básicamente borré esa clase e hice que mis repositorios heredaran directamente de ObjectContext. Un ejemplo de una clase repositorio es la siguiente:
  
namespace mtcholakian.samples.TestDDD.Data.Repositories
{
public class CustomerRepository : GenericRepository<Customer>, ICustomerRepository
{
public CustomerRepository(string connectionString)
: base(connectionString)
{
}

}
}


Si observan en el constructor de la clase, estamos esperando una cadena de conexión. Esta cadena la tomo desde el App.Config o archivo de configuración. Ahora bien, el contenedor de Unity es el que me devuelve una instancia de CustomerRepository, pero cómo hago para pasarle ese parámetro de conexión? Fácil, nuestro App.Config tendrá que lucir de la siguiente manera:

  













Aquí se le dice que el valor del connectionString es "SampleDbEntities", lo cual es el nombre del key de la sección connectionString que va a estar declarada dentro del App.Config también.
Ahora, una cosa más y lo más interesante de todo es que tenemos un atributo typeConverter. Lo que nos dice es que al pasarle al constructor el parámetro connectionString lo resuelva esa clase, que tenemos que definir más arriba de la siguiente forma por ejemplo:

  



Y ahora simplemente vemos la definición en sí de la clase:

  
namespace mtcholakian.samples.TestDDD.Utils
{
public class ConnectionStringTypeConverter : TypeConverter
{
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
return ConfigurationManager.ConnectionStrings[value.ToString()].ConnectionString;
}
}
}


Lo que hace es recibir un valor, en nuestro caso será el que definimos en el parámetro param, "SampleDBEntities" y en base a ese string devuelve la entrada de connectionStrings del App.Config que contiene la conexión a la base de datos.
Listo!
Una cosa muy importante es que la declaración de los tipos del unity aplica únicamente a Unity 2.0, no a la versión 1.4, ya que utilizaba un elemento typeConfig del tipo TypeInjectionElement que no viene más a partir de la versión 2.0.
Espero les haya sido útil.
Saludos,

Mike

No hay comentarios:

Publicar un comentario