MVC DDD:可以在控制器中將儲存庫與服務一起使用嗎?
大多數時候在服務程式碼中我會有這樣的東西:
public SomeService : ISomeService { ISomeRepository someRepository; public Do(int id) { someRepository.Do(id); } }所以有點多餘
所以我開始直接在控制器中使用儲存庫
這個可以嗎 ?有沒有這樣的架構?
你失去了在兩者之間擁有業務邏輯的能力。
我不同意這一點。
如果業務邏輯在它應該在的位置 - 在域模型中,那麼在控制器中呼叫 repo(或者更好地使用模型綁定器)來獲取聚合根並呼叫它對我來說似乎非常好。
當涉及過多的技術細節會弄亂控制器時,應該使用應用程序服務。
我最近看到有幾個人提到使用模型綁定器呼叫回購。這個瘋狂的想法是從哪裡來的?
我相信我們在這裡談論的是兩件不同的事情。我懷疑您的“模型綁定器”也意味著同時使用模型作為視圖模型,並將更改的值從 UI 直接綁定回它(這本身並不是一件壞事,在某些情況下我會走這條路)。
我的“模型綁定器”是一個實現“ IModelBinder ”的類,它在建構子中獲取儲存庫(它是注入的,因此 - 如果我們需要使用一些基本組合進行記憶體,可以對其進行擴展)並在呼叫操作之前使用它來檢索聚合根和用真實的域對象替換
int id或Guid id或string 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 的許多好處,例如不可見的記憶體、事務管理和組件的簡單組合,我無法想像您使用模型綁定器可以獲得這些好處。
…並擁有新的抽象層,邀請我們將基礎架構與域邏輯混合併失去域模型的隔離。
請賜教。
我不確定我是否做到了。我不認為我自己開悟了。:)