2012-10-24 69 views
2

(我要問2個問題)。圖層和實體?

我們使用3層:Bl,Dal,UI。

enter image description here

我們並不想建立一個大BLDAL的所有對象。

所以我們爲AgentsLeads創建了這個結構。

現在可以說我應該寫一個方法:

public Agent GetAgentByLead(Lead leadObj) 
{ 
} 

問題#1

哪裏這個功能應該駐留在:AgentsBLLeadsBL

問題2

可以說,我想用實體框架。

的查詢可以是:

var activeAgents= context.Agents.Where(c => c.ACTIVE).ToList(); 

這條線可以在myPage.aspx.cs文件被執行。

so 其中是這裏的圖層嗎?上下文位於何處?

我只是不明白怎麼EF涉及層(像我的第一個問題)

任何幫助嗎?

回答

3

對於這樣的事情常用的模式是Repository Pattern,如果你google一下,你會發現信息的負荷,這個想法是,你基本上賺那麼你直接從不其封裝的上下文信息庫使用它......

我更喜歡有共同的CRUD方法的通用信息庫,也有類似:

IEnumerable<T> FindAll(IQuery<T> query); 

因此而不是做一個獨特的資源庫爲每個對象類型做具體查詢,比如喲ur GetAgentByLead你把這個邏輯放到查詢中並傳遞上下文,所以你的查詢,存儲庫和控制器(假設MVC)都是獨立的,不依賴於對方。

示例查詢對象會是這樣的:

public interface IQuery<T> 
{ 
    IEnumerable<T> Execute(IContext context); 
} 

public class FindAllUsersInGroupQuery : IQuery<User> 
{ 
    public int GroupId {get; set;} 

    IEnumerable<User> Execute(IContext context) 
    { 
     return context.DoSomeQueryForGettingUsers(GroupId); 
    } 
} 

這種方式可以模擬出你的查詢,資料庫和測試控制器,如果你願意,你也不要與龐大的數據訪問班結束了這很難維持。

1

1)這是一個自行創建的問題,對每個實體都有一個DAL並不是習慣或好主意。但假設他們這麼大,你想分割他們,我認爲GetAgentForSomething()屬於AgentsDAL。然後,這將依賴於Leads。您必須在此注意循環依賴關係,您可能必須定義單獨的DAO和Domain類。

2)context.Agents.Where(...)繞過了分層。考慮AgentsDAL.GetActiveAgents()

+0

我不認爲我得到你(答案#2),'AgentsDAL.GetActiveAgents()'就像我的第一個例子,繞過了BL的電話。 EF電話在這裏?謝謝。 –

+0

該呼叫可以/應該在BL中。 –