2011-05-03 75 views
7

我在解決方案,一個Web應用程序,DAL和BLL的兩個類庫中創建了三個項目。在DAL層中創建了實體框架模型,並在BLL項目中引用了DAL庫。如何爲實體框架創建三層解決方案

當我從Web應用程序項目調用BLL對象時遇到問題,它說我需要引用實體框架。我不想在Web應用程序項目中對DAL庫對象進行任何依賴。

是否有關於使用實體框架構建清潔三層應用程序的具體指導。

回答

17

您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可能是最好的選擇。

+0

謝謝@Nate,數據傳輸對象錯過了並陷入困境。 – inlokesh 2011-05-03 21:10:31

相關問題