Actualmente estoy diseñando una solución de n niveles que utiliza Entity Framework 5 (.net 4) como estrategia de acceso a datos, pero me preocupa cómo incorporar la inyección de dependencia para que sea comprobable / flexible.
El diseño de mi solución actual es el siguiente (mi solución se llama Alcatraz):
Alcatraz.WebUI : un proyecto de formulario web asp.net, la interfaz de usuario front-end, hace referencia a proyectos Alcatraz.Business y Alcatraz.Data.Models .
Alcatraz.Business : un proyecto de biblioteca de clases, contiene la lógica empresarial, hace referencia a proyectos Alcatraz.Data.Access , Alcatraz.Data.Models
Alcatraz.Data.Access : un proyecto de biblioteca de clase, alberga AlcatrazModel.edmx y AlcatrazEntities
DbContext, hace referencia a proyectos Alcatraz.Data.Models .
Alcatraz.Data.Models : un proyecto de biblioteca de clases, contiene POCO para el modelo Alcatraz, sin referencias.
Mi visión de cómo funcionaría esta solución es que la web-ui instanciaría un repositorio dentro de la biblioteca de negocios, este repositorio tendría una dependencia (a través del constructor) de una cadena de conexión (no una AlcatrazEntities
instancia). La interfaz de usuario web conocería las cadenas de conexión de la base de datos, pero no es que fuera una cadena de conexión del marco de la entidad.
En el proyecto empresarial:
public class InmateRepository : IInmateRepository
{
private string _connectionString;
public InmateRepository(string connectionString)
{
if (connectionString == null)
{
throw new ArgumentNullException("connectionString");
}
EntityConnectionStringBuilder connectionBuilder = new EntityConnectionStringBuilder();
connectionBuilder.Metadata = "res://*/AlcatrazModel.csdl|res://*/AlcatrazModel.ssdl|res://*/AlcatrazModel.msl";
connectionBuilder.Provider = "System.Data.SqlClient";
connectionBuilder.ProviderConnectionString = connectionString;
_connectionString = connectionBuilder.ToString();
}
public IQueryable<Inmate> GetAllInmates()
{
AlcatrazEntities ents = new AlcatrazEntities(_connectionString);
return ents.Inmates;
}
}
En la interfaz de usuario web:
IInmateRepository inmateRepo = new InmateRepository(@"data source=MATTHEW-PC\SQLEXPRESS;initial catalog=Alcatraz;integrated security=True;");
List<Inmate> deathRowInmates = inmateRepo.GetAllInmates().Where(i => i.OnDeathRow).ToList();
Tengo algunas preguntas relacionadas sobre este diseño.
¿Este diseño tiene sentido incluso en términos de capacidades de Entity Frameworks? Escuché que Entity Framework ya usa el patrón de Unidad de trabajo, ¿estoy agregando otra capa de resumen innecesariamente?
No quiero que mi web-ui se comunique directamente con Entity Framework (o incluso hacer referencia a él), quiero que todo el acceso a la base de datos pase por la capa empresarial, ya que en el futuro tendré varios proyectos utilizando la misma capa empresarial. (servicio web, aplicación de Windows, etc.) y quiero que sea fácil de mantener / actualizar teniendo la lógica de negocios en un área central. ¿Es esta una forma apropiada de lograr esto?
¿Debería la capa Business incluso contener repositorios, o debería estar dentro de la capa Access? Si dónde están está bien, ¿pasar una cadena de conexión es una buena dependencia para asumir?
¡Gracias por tomarse el tiempo de leer!
DbContext
como su dependencia. Las clases de negocios tienen repositorios como dependencia. Para la inyección de dependencia, estoy haciendo esto manualmente (así que entiendo lo que está pasando). La razón por la que quiero poder establecer la cadena de conexión en elDbContext
es que uso el particionamiento de la base de datos, por lo que en ciertos casos necesito tener un marco de entidad para conectarme a diferentes bases de datos (de la misma estructura). ¿Te entiendo correctamente?Algunos comentarios rápidos Yo personalmente probablemente no pasaría una cadena de conexión. En todo caso, ¿intentaría crear interfaces para los repositorios y simplemente pasar las interfaces? Haga que los repositorios implementen o expongan una interfaz IOW.
De esta manera, no es necesario que sea una base de datos que implemente sus repositorios. podrían ser una memoria caché, o cualquier cosa. ¿Quizás entonces podría usar algún tipo de marco de inyección de dependencia para crear una instancia de estos incluso?
Entonces, en respuesta a algunas de sus preguntas:
Estos son solo algunos pensamientos para reflexionar.
fuente