Entity Framework y separación de capas

12

Estoy intentando trabajar un poco con Entity Framework y tengo una pregunta sobre la separación de capas.

Normalmente uso la interfaz de usuario - > BLL - > Enfoque de DAL y me pregunto cómo usar EF aquí.

Mi DAL usualmente sería algo como

GetPerson(id)
{
    // some sql
    return new Person(...)
}

BLL:

GetPerson(id)
{
    Return personDL.GetPerson(id)
}

UI:

Person p = personBL.GetPerson(id)

Mi pregunta ahora es: ya que EF crea mi modelo y DAL, ¿es una buena idea envolver a EF dentro de mi propio DAL o es solo una pérdida de tiempo?

Si no necesito ajustar EF, ¿seguiría colocando mi Model.esmx dentro de su propia biblioteca de clases o estaría bien colocarlo dentro de mi BLL y trabajar allí?

Realmente no puedo ver la razón para encerrar a EF dentro de mi propio DAL, pero quiero saber qué están haciendo otras personas.

Entonces, en lugar de tener lo anterior, omitiría el DAL y simplemente lo haría:

BLL:

GetPerson(id)
{
    using (TestEntities context = new TestEntities())
    {
            var result = from p in context.Persons.Where(p => p.Id = id)            
                    select p;
    }
}

¿Qué hacer?

    
pregunta Thomas 21.12.2011 - 10:46

3 respuestas

13

El ejemplo que proporciona no es una arquitectura en capas. Sé que está simplificado intencionalmente, pero:

Su capa de presentación está directamente vinculada a la entidad Persona. Esto está bien solo en los casos más simples, y definitivamente no cuando intenta definir sus capas.

El método GetPerson también está utilizando una práctica bastante mala de crear un nuevo contexto para cada llamada. Debería obtener el contexto en el constructor, y lo proporcionará su contenedor IOC.

Una estructura simple pero efectiva que he usado es:

  • Project.Core: contiene modelos e interfaces de vista.
  • Project.DAL - con mi EDMX y el código generado.
  • Project.BLL - lógica de negocios.
  • Project.Web: la aplicación web en sí misma.

Es importante tener en cuenta que:

  • El núcleo no depende de ninguna otra solución.
  • DAL no depende de ninguna otra solución.
  • Project.Web depende de Core, pero no de DAL ni BLL.
  • BLL depende de Core y DAL.
respondido por el Boris Yankov 21.12.2011 - 11:29
2

No necesitas envolver tu EDMX en nada.

Si puede prever la posibilidad de tener que cambiar de EF a algún otro enfoque, es posible que desee extender sus objetos de negocio (aprovechando las clases parciales) para implementar interfaces definidas en una capa de Objeto de Negocio separada.

Luego, desde su código, solo tratará con esas interfaces y no con las clases generadas concretas. Podría necesitarse un poco de código de pegamento para mantener esto unido; que con el EDMX puede ser su DAL.

    
respondido por el sq33G 21.12.2011 - 11:48
2

Hay dos enfoques generales de capas: capas estrictas y capas relajadas.

Un enfoque estrictamente en capas restringe los componentes en una capa a interactuar solo con compañeros y con la capa directamente debajo.

Una aplicación de capas relajada afloja las restricciones de tal manera que un componente puede interactuar con componentes de cualquier capa inferior.

El uso de capas relajadas puede mejorar la eficiencia porque el sistema no tiene que reenviar llamadas simples de una capa a la siguiente. Por otro lado, el uso de capas relajadas no proporciona el mismo nivel de aislamiento entre las capas y hace que sea más difícil cambiar una capa inferior sin afectar las capas más altas.

Para soluciones grandes que involucran muchos componentes de software, es común tener un gran número de componentes en el mismo nivel de abstracción que no sean cohesivos. En este caso, cada capa se puede descomponer en uno o más subsistemas cohesivos. La Figura 2 ilustra una posible notación del Lenguaje de modelado unificado (UML) para representar capas que están compuestas por varios subsistemas.

conclusión: si no necesitas perder la capa intermedia; no todas las aplicaciones requieren el mismo enfoque y, de alguna manera, agregar una capa solo para el uso de capas tendrá penalizaciones en el costo de complejidad y mantenimiento.

    
respondido por el omarqa 21.12.2011 - 15:23

Lea otras preguntas en las etiquetas

Comentarios Recientes

funcionalidad. Web Views es compatible con Razor y está alojado en GitHub. < ResourceResource action = "FileDownload" /> Lee mas