2010-09-30 30 views
0

我終於開始檢查最新的EF發行版,並且遇到了一些與我的測試有關的麻煩。C#EF4和分層設計的程序集引用錯誤

因此,我的DAL圖層保存了我的.EDMX文件,並使用了MS POCO模板,因此我也生成了.TT文件和類。

我在TestProject.DAL中有一個通用的基類我創建了這些類派生自。 也就是說

public class BaseEntity<T> {} 
public class Customer : BaseEntity<Customer> {} 
public class Product : BaseEntity<Product> {} 

然後在我的TestProject.BLL層,我有一些派生類 即

public class TestProject.BLL.Customer : TestProject.DAL.Customer {} 
public class TestProject.BLL.Product : TestProject.DAL.Product {} 

然後,在我的UI層,我打電話給我的BLL.Customer對象。 我收到一個錯誤,說沒有添加對DAL.Customer對象的引用等。

我從我的UI項目中引用了BLL項目,並從我的BLL項目中引用了DAL。

爲什麼UI層抱怨說它沒有在該項目中引用時知道DAL層?

此外,作爲一個側面的問題,這看起來像一個「好」的設計?

謝謝大家! 鵝

回答

1

Craig是正確的 - 您的UI正在引用POCO實體類型。但我會詳細說明一點。

如果你是在一個情況下你的UI項目引用BLL組件和組件引用DAL裝配公開曝光從DAL裝配任何成員,那麼你說的話會是正確的。但這不是這裏發生的事情。您正在引用BLL程序集,並且該程序集中的類型直接從DAL類型繼承,因此DAL類型,它們是公開可見的。因此,編譯器(正確)告訴你必須從UI項目中引用DAL程序集。

至於你的「好設計」問題,總是依賴於上下文。在不知道任何背景的情況下,我會毫不猶豫地創建一個像這樣的繼承樹。你在BLL大會中的子課程的工作是什麼?

+0

因此,引用是基於DLL類的可見性隱式的。 – Goosey 2010-09-30 18:59:47

+0

正確 - 取決於*可視性*。 – 2010-09-30 20:21:41

+0

關於我的設計,我只是試圖遵循基本的n-Layered設計模式。我想保留所有我的域邏輯在BLL.dll即Users.ChangePassword()和Users.AcceptAgreement()等和所有的DAL.dll東西只有數據特定項目用戶。Add()和最後BaseEntity爲所有實體提供相關方法BaseEntity .GetById()BaseEntity .Search()等 – Goosey 2010-09-30 21:32:19

1

你的UI 確實參考POCO實體類型 - 通過BaseEntity泛型類型參數。

+0

感謝您的答覆克雷格! – Goosey 2010-09-30 17:16:20

+0

你能詳細解釋一下你的答案嗎? BaseEntity只在DAL中,這是由UI引用的BLL的引用。 – Goosey 2010-09-30 17:17:02

+0

我應該多說一些自己。我有2個版本的每個實體類,1個在DAL中,1個在BLL中。 – Goosey 2010-09-30 17:17:47