2013-02-10 53 views
3

我建立在C#標準的三層應用程序三層應用程序 - 在哪裏把數據和商業模式

1個控制檯應用程序的前端/但我可能會改變這一個ASP.NET MVC的Web頁面

2業務邏輯層

3使用實體框架數據層連接到一個SQL數據庫/但是這可能會改變到Windows Azure

的主要目的是,以顯示一些客戶數據。

存儲在數據庫中的客戶具有以下字段 -

CustomerID 
Firstname 
Lastname 
DateOfBirth 
Othervalue1 
Othervalue2 
Othervalue3 
Creationdate 
Updatedate 
IsDisabled //this represents "deleted" customers i.e. the app will never use deleted customers, but I want to keep them in the database anyway 

在中間層,我只想

CustomerID 
Firstname 
Lastname 
DateOfBirth 
Othervalue1 
Othervalue2 
Othervalue3 
Updatedate 

而且在第一個應用程序的前端我只顯示

CustomerID 
Firstname 
Lastname 
DateOfBirth 

如何從加載的角度正確實現n層應用程序來自數據層的客戶(可能會更改),並在中間層使用該客戶,然後在表示層(可能會更改)中使用該客戶?

我在哪裏放置客戶模型?我需要多個嗎?我需要某個ICustomer接口嗎?

項目細節 該項目將由兩個小組進行開發,一個設在美國,東歐等,將有四個到五人組成員之間。

有一個傳統的數據訪問層,這個項目不會使用。相反,我們將用Entity Framework構建一個新的;我們需要設計和構建一個將用於所有新應用程序的數據層(對於這個應用程序,我們只需要客戶表和一個或兩個表)。其他項目將爲此圖層添加其他表格。

我正在使用DI注入ICustomerRepository(請參閱此SO question)。但是會實施存儲庫和工作模式單元。

我的問題是關於適當分離圖層。我們將在未來幾個月內增加許多新項目,新的數據層將迅速增長。我們也在考慮在某個時候遷移到Azure,所以我希望能夠替換實體框架數據層,而不必重寫業務層和前端層。

+0

我認爲這是更主觀的,你可能會想。 Mark Seeman在http://blog.ploeh.dk/2012/02/09/IsLayeringWorthTheMapping.aspx – Joe 2013-02-10 01:23:04

+0

寫了一篇很棒的文章。我正在閱讀他關於DI的書以及他的一些博客文章。他們被認爲是令人髮指。 – tom 2013-02-10 02:25:38

回答

5

您有一個數據模型(數據庫模式),一個領域模型和一個視圖模型。

如果您的目標是分離圖層,那麼您應該在這三個圖層中的每個圖層中分別代表客戶的類(但請參閱註釋中的the article @Joe mentions)。

您的數據訪問技術將推動數據模型到域模型的映射。如果您使用實體框架,則可以在這兩種模型之間進行映射。

要將領域模型映射到視圖模型,請查看Automapper以瞭解領域對象(例如業務對象)和視圖模型之間的映射關係。

UPDATE

基於新的信息,我將分享我會做什麼。這當然不是唯一有效的方法。

鑑於分散的團隊,清晰的責任線是重要的。不同的人,在不同的時區,不同的團隊領導,將在代碼上工作。

賦予了新的軟件在舊的數據庫建立,必須注意的三個事實:

  • 這不會是容易改變原有數據庫,以適應新的軟件的需求。
  • 由於現有數據庫的結構,新軟件不應該是固有的次優設計。
  • 在您構建的下一個應用程序中可能需要會污染當前應用程序設計的數據。

我會做以下

  • 創建數據傳輸對象代表的傳統數據庫的結構(DTO的)。
  • 使用Repository and Unit of Work Patterns可以訪問業務對象層的DTO。
  • 根據應用程序的需要設計業務對象層(中間層,其中的類通常稱爲實體)。不要污染基於DTO結構的對象設計(最終是遺留數據庫的結構)。
  • 使用諸如Automapper之類的技術來緩解這兩層之間映射的管道工作。
  • 創建UI對象(在MVC術語中稱爲模型),它們表示給定UI屏幕(MVC術語中的視圖)將處理的數據。
  • 取決於UI模型與業務對象(實體)的對齊程度,您可能需要使用Automapper,或者可能只是想將它們填充到自定義代碼中。

再次,這就是我將如何處理它給我的背景,經驗和喜好。這不是唯一有效的方法。

+0

要從數據層映射到業務層,業務層中將存在對具體類的依賴關係。這被認爲是好的嗎?而且這聽起來UI將依賴於業務層中的具體類,也可以嗎? – tom 2013-02-10 04:12:15

+0

「確定」取決於您的具體需求。如果你在一個團隊中工作,其中不同的成員分別在UI,業務層和數據層上工作,那麼這種依賴關係可能很難管理。如果只是你或者一個非常小的團隊,乾淨地分離和映射圖層所增加的時間和複雜性可能並不值得。對於小型到中型項目,我通常發現使用EF(沒有DTA)持久存儲的業務對象可以很好地工作,並且我在MVC層中使用這些業務對象。其他人會不同意這是一個好方法。我不會在一個大型項目中這樣做。 – 2013-02-10 08:23:22

+0

你會如何「乾淨地分離和映射圖層」? DTA是什麼意思?我用這個應用程序的DI也看到我的問題 - http:// stackoverflow。com/questions/14785855/ninject-in-a-three-tier-application – tom 2013-02-10 17:45:54

相關問題