2011-05-03 15 views
7

Creé tres proyectos en una solución, una aplicación web, dos bibliotecas de clases para DAL y BLL. Se creó el modelo de Entity Framework en la capa DAL y se hizo referencia a la biblioteca DAL en el proyecto BLL.Cómo crear una solución de tres niveles para Entity framework

Cuando llamo a los objetos BLL del proyecto de aplicación web me encuentro con problemas, me dice que necesito hacer referencia al marco de la entidad. No quiero ninguna dependencia en los objetos de la biblioteca DAL en el proyecto de la aplicación web.

¿Hay alguna guía específica sobre la construcción de aplicaciones limpias de tres niveles utilizando Entity Framework.

Respuesta

17

Parece que su BLL está exponiendo las clases entity que ha agregado en el DAL. Tendrá que crear clases contenedoras (que sean POCO) en el BLL y devolverlas en lugar de las entidades del DAL.

Esto es probablemente lo que son haciendo:

// DAL 
// .edmx file generated entities 
public IQueryable<TableEntity> GetTableEntities() 
{ 
    // read from entity framework and return 
} 

// BLL 
public IEnumerable<TableEntity> ReadTableEntitiesForUser(int userID); 
{ 
    var d = new DAL(); 
    var entities = d.GetTableEntities(); 
    // restrict to entites this user "owns" 
    entities = entities.Where(e => e.OwnerID.Equals(userID)); 
    return entities;   
} 

// WebApp 
var b = new BLL(); 
var myEntities = b.ReadTableEntitiesForUser(1234); 

Esto es probablemente lo que debe estar haciendo:

// DAL 
// .edmx file generated entities 
public IQueryable<TableEntity> GetTableEntities() 
{ 
    // read from entity framework and return 
} 

// BLL 
public class TableEntityDTO 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    // continue on for each column in the table 
    // and make a DTO class for each table in your database 
} 
public IEnumerable<TableEntityDTO> ReadTableEntitiesForUser(int userID); 
{ 
    var d = new DAL(); 
    var entities = d.GetTableEntities(); 
    // restrict to entites this user "owns" 
    entities = entities.Where(e => e.OwnerID.Equals(userID)); 
    // convert from "Entity Framework Object" to "BLL Object" 
    foreach(var e in entities) 
    { 
     yeild return new TableEntityDTO() { ID = e.ID, Name = e.Name }; 
    } 
} 

// WebApp 
var b = new BLL(); 
var myEntities = b.ReadTableEntitiesForUser(1234); 

Esto es cierto para el marco de la entidad que se incluye con. NET 3.5SP1 y para Linq-To-SQL, los cuales he usado un poco, puede ser cierto para las últimas versiones de EF, pero con Code-First y otras cosas puede haber una forma de evitar este Data-Trans extra. paso fer-Object, aunque con una arquitectura orientada a servicios, los DTO son probablemente la mejor manera de hacerlo.

+0

Gracias @Nate, el Data-Transfer-Object se perdió y se metió en problemas. – inlokesh

Cuestiones relacionadas