Asp.net-Mvc

MVC DDD:可以在控制器中將儲存庫與服務一起使用嗎?

  • December 19, 2016

大多數時候在服務程式碼中我會有這樣的東西:

public SomeService : ISomeService
{
   ISomeRepository someRepository;
   public Do(int id)
   {
       someRepository.Do(id);
   }
}

所以有點多餘

所以我開始直接在控制器中使用儲存庫

這個可以嗎 ?有沒有這樣的架構?

你失去了在兩者之間擁有業務邏輯的能力。

我不同意這一點。

如果業務邏輯在它應該在的位置 - 在域模型中,那麼在控制器中呼叫 repo(或者更好地使用模型綁定器)來獲取聚合根並呼叫它對我來說似乎非常好。

當涉及過多的技術細節會弄亂控制器時,應該使用應用程序服務。


我最近看到有幾個人提到使用模型綁定器呼叫回購。這個瘋狂的想法是從哪裡來的?

我相信我們在這裡談論的是兩件不同的事情。我懷疑您的“模型綁定器”也意味著同時使用模型作為視圖模型,並將更改的值​​從 UI 直接綁定回它(這本身並不是一件壞事,在某些情況下我會走這條路)。

我的“模型綁定器”是一個實現“ IModelBinder ”的類,它在建構子中獲取儲存庫(它是注入的,因此 - 如果我們需要使用一些基本組合進行記憶體,可以對其進行擴展)並在呼叫操作之前使用它來檢索聚合根和用真實的域對象替換int idGuid idstring slug或動作參數。whatever將其與輸入視圖模型參數相結合可以讓我們編寫更少的程式碼。像這樣的東西:

public ActionResult ChangeCustomerAddress
(Customer c, ChangeCustomerAddressInput inp){
 c.ChangeCustomerAddress(inp.NewAddress);
 return RedirectToAction("Details", new{inp.Id});
}

在我的實際程式碼中,它有點複雜,因為它包括 ModelState 驗證和一些可能從域模型內部拋出的異常處理(提取到控制器擴展方法中以供重用)。但不多。到目前為止 - 最長的控制器動作大約是 10 行。

你可以在這裡看到工作實現(非常複雜和(對我來說)不必要的複雜)。

您只是在使用 Linq To Sql 做 CRUD 應用程序,還是在嘗試使用真正的域邏輯?

正如您可以(希望)看到的那樣,這種方法實際上幾乎迫使我們轉向基於任務的應用程序,而不是基於 CRUD 的應用程序。

通過在服務層進行所有數據訪問並使用 IOC,您可以獲得 AOP 的許多好處,例如不可見的記憶體、事務管理和組件的簡單組合,我無法想像您使用模型綁定器可以獲得這些好處。

…並擁有新的抽象層,邀請我們將基礎架構與域邏輯混合併失去域模型的隔離。

請賜教。

我不確定我是否做到了。我不認為我自己開悟了。:)


是我目前的模型綁定器基類。這是我目前項目中的控制器操作之一。這是業務邏輯“缺乏”。

引用自:https://stackoverflow.com/questions/3574992