2011-02-22 59 views
2

或者我完全不理解這個。 >視圖模型 - - >服務 - >庫模式ASP.NET MVC - 我認爲我正在討論這個錯誤

我已經使用Controller開始了我的ASP.NET MVC應用程序。

是否每個類型的對象(客戶,產品,類別,發票等。)需要有它自己的存儲庫和服務?如果是這樣,你如何把共同的物品放在一起?

我的意思是有很多的時代,當一些這些東西將在同一頁面上顯示。所以我沒有得到這個我不認爲。

所以我在想我需要一個ShopController,它有一個ShopViewModel,它可以有類別,子類別,產品等等。但是對我而言,問題在於它看起來好像不太好。

也許ASP.NET的WebForms是對我這樣的人:)

編輯

所以將聚集包括說的:

類別,子類別,產品,ChildProduct,ProductReview與產品是聚合根?

然後在的ViewModels,你會訪問產品以獲得在其子產品,評論等

我使用實體框架4,那麼你將如何使用存儲庫/服務模式實現延遲加載?

+0

你能進一步解釋你的問題嗎? – 2011-02-22 23:30:34

回答

6

是否每個類型的對象(客戶, 產品,類別,發票等。) 需要有它自己的倉庫

你應該有每個聚合根的存儲庫中您的域名。查看question瞭解什麼是聚合根的更多信息。

在這個例子中你給我可以看到一個CustomerReposiotry這將處理檢索所有相關客戶數據(客戶有訂單纔能有一個客戶)。處理檢索產品信息的ProductRepository。

和服務?如果是這樣,你如何把 共同項目放在一起?

服務層不錯,但只有在添加此層時增加了值。如果您的服務只是直接傳入存儲庫,則可能不需要。但是,如果您需要在產品上執行某些業務邏輯,則ProductService可能是有意義的。

這可能沒有什麼意義

public void UpdateProduct(Product product) 
{ 
    _repo.Update(product); 
} 

但如果你有邏輯這層有意義的封裝產品業務規則。

public void UpdateProduct(Product productToUpdate) 
{ 
    //Perform some sort of business on the productToUpdate, raise domain events, .... 
    _repo.Update(productToUpdate); 
} 

所以我想我需要一個 ShopController,其中有一個 ShopViewModel,這可能會對 類別,分依種類,產品 等,但這個問題,對我來說,是 它只是看起來不好。

如果域名衝出視圖模型最終決策意識

public ActionResult Index() 
{ 
    ShopViewModel shopViewModel = new ShopViewModel(); 
    shopViewModel.Products = _productRepo.GetAll(); 
    //other stuff on the view model. 
    return(shopViewModel); 
} 

更新

當你還需要 提供從 總無法獲得的數據會發生什麼根?例如,說我在 有一個創建客戶視圖,並在 那個視圖,我還需要提供 用戶與一個公司收集到 選擇關聯一個新的 客戶。 公司的收集是否來自CustomerRepository 或您是否還需要 CompanyRepository?

如果一個公司可以通過自身生活(如編輯,更新,刪除公司),我會建議公司也爲您的域(合計根客戶有一個公司,一個公司有一個列表顧客)。但是,如果公司只能通過客戶獲得,我會將公司視爲ValueType/Value對象。如果是這種情況,我會在客戶存儲庫上創建一個方法來檢索所有公司名稱。

_repo.GetAllCompanyNames(); 
+1

當你還需要提供聚合根無法獲取的數據時會發生什麼?例如,假設我有一個創建客戶視圖,並且在該視圖中,我還需要向用戶提供一組公司可供選擇的關聯新客戶的集合。公司集合是來自CustomerRepository還是您還需要一個CompanyRepository? – 2011-02-22 23:48:20

+0

已更新回答你的問題。 – 2011-02-23 00:05:13

+0

@Russ您在控制器操作中只有兩個不同的服務調用,並將您的視圖模型中的客戶和公司列表都放入您的視圖模型中。 – Ryan 2011-02-23 00:06:01

1

您可以通過多種類型的存儲庫中的控制器(我假設你使用某種IoC容器和構造器注入的)。然後,您可能決定從所有傳遞的存儲庫中編寫某種類型的服務對象。

4

存儲庫是不可缺少的,只要與他們一起去。他們隱藏數據實施。與ORM一起使用,你幾乎可以忘記核心數據庫活動(CRUD)。通常情況下,對象和存儲庫之間會有1:1的映射,但是沒有任何東西會阻止存儲庫返回任何喜歡的東西。通常情況下,儘管你會採取行動。爲自然適合現有查詢的查詢創建非對象特定的存儲庫。

你會在它的「服務」部分發現許多衝突的論點 - 有些人喜歡在域服務之間進行拆分(我把這些業務規則稱爲不適合放入核心域對象)和應用程序服務(對域對象的操作的邏輯分組)。我已經去過一個名爲[ProjectName] .Core.Operations的單獨項目,它位於我的[ProjectName] .Core解決方案文件夾中。核心+操作=域。

一個操作可能會返回一個DTO,它包含一個View需要通過域上的許多存儲庫調用和操作構建的所有信息。有些人(包括我自己)傾向於將存儲庫從Presentation完全隱藏起來,而使用Operations(Services)作爲它們的外觀。就命名而言,只要有感覺,不要害怕,重構是健康的。 HomePageOperations類沒有錯,GetEveryThingINeedForTheHomepage方法返回一個ThingsINeedForTheHomePage類。

保持您的控制器儘可能輕。他們所做的只是將數據映射到數據的視圖和視圖,與「服務」交談並處理應用程序流。

下載並看看S#arp architectureWho Can Help Me項目。後者真的顯示了一個好的建築恕我直言。

最後不要忘記層級的一個主要問題是可插拔性/可測試性,所以我建議讓你的頭繞着一個好的IoC容器(我是Castle.Windsor的粉絲)。再次S#arp架構是找到這個問題的好地方。

+0

@Bob - 所以我的控制器與我的服務對話來填充ViewModels? – Sam 2011-02-23 00:03:40

+0

正確。如同您將IRepositories一樣定義IServices並將它們注入到您的Controller構造函數中。 – 2011-02-23 00:07:43

+0

@Bob - 你會看看我上面的編輯並回答這幾個問題嗎? – Sam 2011-02-23 00:27:49