2016-08-11 128 views
0

我在n層概念上掙扎。起初,我有這個概念,我的域實體將在我的3層共享(DAL,BLL,Service)。但最近被告知這是一個古老的概念,並沒有真正遵循SOLID概念。而是被告知爲每個圖層創建和對象。N層對象參數

Service 
    ObjectService 
Business 
    ObjectBus 
DAL 
    Object 

哪一個是服務依然依賴於業務,業務依賴於dal等。但我不確定如何傳遞我的對象或如何創建它們。

讓我的數據層說我有一個person.cs具有以下屬性

public class Person:Base 
{ 
    public string firstName { get; set; } 
    public string lastName { get; set; } 
    public string middleName { get; set; } 
} 

在我的業務對象,我應該像這樣創建

Boolean CreatePerson(userrole r,string f, string l, string m); 

的業務方法或者我應該做的像這樣的東西

Boolean CreatePerson(PersonHandler pmo); 

我在哪裏有一個班PersonH​​andler

public class PersonHandler 
{ 
    public UserRole r { get; set; }; 
    public Person p { get; set; }; 
} 

在這種情況下,userrole只是業務層需要的額外屬性。我喜歡爲業務層創建一個對象,因爲我可以更容易地更改與此對象關聯的所有屬性,但是我覺得我仍然需要訪問域實體(Person),但我被告知這很糟糕。但是,如果我爲每個對象創建一組屬性,我只是覺得這是多餘的。如果將來我在DAL換了我的人,那是不是意味着我必須改變上升的每一個參數?

這裏的樣本更多的在我的文件夾結構

enter image description here

的高清這是我DAL結構。

enter image description here

+0

很明顯,使用'Boolean CreatePerson(userrole r,string f,string l,string m)'這樣的方法是個壞主意。使用DAL層clases作爲BL中的輸入參數應該不成問題。 – Vladimir

+0

你怎麼做你的數據訪問? entity frameowrk,nhibernate,orm?你在做cqrs嗎? – Fran

+0

我正在使用實體框架 – Jseb

回答

0

你的結構看起來像是完全矯枉過正。你聲明你正在使用實體框架。這是一個ORM應該將您的業務實體/對象映射到數據結構,並應該這樣使用。

爲什麼不先創建使用EF代碼的域,並使用屬性將域實體映射回sql表?我假設後端有sql。將您的業務邏輯保留在您的域模型中,否則您有機會創建一個anemic mode l

對於前端,我將定義視圖模型,這些視圖模型代表您向用戶呈現的屏幕/視圖,因爲它與域分離對象。然後從您的域對象填充視圖模型。

+0

因爲我使用的是Entity Framework,所以建議我創建一個具有poco對象的域圖層,並且可以在圖層之間進行共享?我被告知這不是固定的,因爲程序員可以以某種方式直接從服務層設置它(我的理解) – Jseb

+0

我們還希望有一個DAL可以使ORM保持回購模式,這是因爲回購更容易注入/模擬而不在整個業務層上對ORM(EF/NHibernate或其他)產生任何依賴關係。從理論上講,ORM可以幫助您輕鬆地將RDBMS替換爲其他類型,但實際上並非如此,有時甚至需要針對性能或任何原因破解一些實際的SQL,並直接在內部使用ORM框架您的業​​務層意味着您將最終編寫SQL代碼。 – Groo

+0

我也在我的域對象周圍使用了這個確切的原因。你可以用映射拆分poco對象以更好地分離,並將自定義sql放置在映射中,但是在數據訪問級別上沒有完整的單獨Person,這裏有一個PersonMap映射對象。 – Fran

0

注意,Person類型是特定的數據層。業務層(和其他人)不知道什麼是Person。業務層有它自己的「人」的想法,應該有一個單獨的類,可能有任何額外的屬性,你可能想要的。這是多層次的關鍵。

現在,您無法直接在圖層之間移動對象。您需要相鄰圖層之間的映射器,這需要一個對象,例如DataLayer.Person並將其轉換爲BusinessLayer.Person

您可以構建自己的映射器,也可以使用像AutoMapper這樣的工具。

+1

如果業務層依賴於DAL,業務層可能會*知道*什麼是Person。 – Groo

+0

如果您正在使用EF,那麼應該照顧您將業務人員映射到sql表格。爲什麼你需要一個數據層的人? – Fran

+0

Friom這種方法似乎有道理,我會創建一個名爲Automapper的文件夾,並在裏面看到PersonMap類,它允許我直接與dal交談並映射它 – Jseb