如何为Entity框架创建三层解决方案

时间:2011-05-03 20:49:45

标签: .net asp.net entity-framework soa

我在一个解决方案中创建了三个项目,一个Web应用程序,两个用于DAL和BLL的类库。在DAL层创建了Entity Framework模型,并在BLL项目中引用了DAL库。

当我从Web应用程序项目调用BLL对象遇到问题时,它说我需要引用实体框架。我不想在Web应用程序项目中对DAL库对象有任何依赖。

是否有关于使用Entity Framework构建干净的三层应用程序的具体指导。

1 个答案:

答案 0 :(得分:18)

听起来你的BLL暴露了你在DAL中添加的entity类。您需要在BLL中创建包装类(即POCO)并从DAL中返回这些类而不是实体。

这可能是你 做的事情:

// 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);

这可能是你应该做的事情:

// 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);

对于.NET 3.5SP1和Linq-To-SQL附带的实体框架都是如此,我已经使用了它们,它可能适用于EF的最新版本,但使用Code-First和其他方面可能有一种方法可以避免这种额外的数据传输对象步骤,尽管采用面向服务的体系结构,DTO可能是最好的方法。