我在一个解决方案中创建了三个项目,一个 Web 应用程序,两个用于 DAL 和 BLL 的类库。在 DAL 层中创建了 Entity Framework 模型,并在 BLL 项目中引用了 DAL 库。
当我从 Web 应用程序项目调用 BLL 对象时,出现了问题,它说我需要引用实体框架。我不想在 Web 应用程序项目中依赖于 DAL 库对象。
在使用 Entity Framework 构建干净的三层应用程序方面是否有任何具体指导?
我在一个解决方案中创建了三个项目,一个 Web 应用程序,两个用于 DAL 和 BLL 的类库。在 DAL 层中创建了 Entity Framework 模型,并在 BLL 项目中引用了 DAL 库。
当我从 Web 应用程序项目调用 BLL 对象时,出现了问题,它说我需要引用实体框架。我不想在 Web 应用程序项目中依赖于 DAL 库对象。
在使用 Entity Framework 构建干净的三层应用程序方面是否有任何具体指导?
听起来你的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可能是最好的选择。