如何为实体框架创建三层架构解决方案

8

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

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

在使用 Entity Framework 构建干净的三层应用程序方面是否有任何具体指导?

1个回答

19

听起来你的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 发布的Entity Framework和Linq-To-SQL,我都用过一些,对于最新版本的EF可能仍然有效,但使用Code-First等其他方法可能有办法避免这个额外的数据传输对象步骤,不过在面向服务的架构中,DTO可能是最好的选择。


谢谢@Nate,数据传输对象被遗漏了,导致出现问题。 - inlokesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接