2011-07-28 59 views
0

我執行在.net中的N層架構,由一個實體層,DAL層,業務層和用戶界面層。項目結構爲淨N層架構 - 交叉引用層

實體除了原始字段之外還包含導航屬性。這將是一個Invoice實體,它具有一個InvoiceLines屬性,該屬性應該返回與父級Invoice實體關聯的所有InvoiceLine實體。

由於業務邏輯需要將這些業務邏輯應用到這些InvoiceLines,因爲這些業務邏輯一旦從持久性介質中檢索並且不想複製代碼,Invoice實體上的InvoiceLines屬性就會通過調用到業務邏輯中的GetInvoiceLinesByInvoiceID方法,該方法返回IEnumerable。

我的問題是這樣的 - 我不能層分離成單獨的項目,因爲該項目的實體依賴於商業項目,商業項目依賴於實體項目,從而引入交叉引用。我目前擁有生活在同一個項目中的所有3層(實體,DAL和商業),這很好,但意味着我不能在其他解決方案中共享實體。

我明白,在這樣的交叉引用層我違反原則一些,但它是非常方便的填充我的實體適用於他們的業務邏輯的導航性能。

任何人都可以請提出一個更好的辦法,或者一些方法,我可以做到這一點,同時保持我在各層獨立的項目?

乾杯

+0

爲清楚起見,我需要用一個SQLCLR項目共享只是實體層 - 包含實體,DAL和業務整個「圖層」項目,包含了一些引用的程序通過SQLCLR不支持的,所以我不能只是添加了整個部件。 – Hoodlum

回答

2

我一直在這種情況下自己多次,通常有一個簡單的出路。

我會在這裏做一些假設,但希望他們會是對的。如果你使用的是基於接口的方法,你的業務邏輯將實現一些接口,你的實體將實現一些接口。從實體到業務對象的任何依賴只應該是從業務對象到實體的接口,反之亦然。這應該很容易將接口剝離到一個單獨的項目中(或者兩個),然後將業務邏輯和具體實體分離到他們自己的項目中,只需要引用接口程序集。

希望這是有道理的。

+0

對於一個很好的例子,看到SharpArchitecture項目www.sharparchitecture.net –

+0

它的意義對我來說...「因爲你描述我目前的項目結構:d – Jonathan

+0

我覺得我得到你的意思 - 如果我定義的字段在我的實體上作爲一個接口,並且使實際的實體實現這個接口,並且另外使得業務層返回一個實現相同接口的對象,它們將能夠被分離出來。 – Hoodlum