我正在實現一種使用單個數據存儲但分開查詢和命令模型的CQRS形式。對於我正在實施DDD的命令方面,包括存儲庫,IoC和依賴注入。對於查詢方面,我使用here所述的Finder模式。基本上,查找器類似於存儲庫,但僅限於查找方法。CQRS - 接口和依賴注入是否需要讀取模型?
因此,在我的應用程序中,在我的DAL中,我使用ADO.net和原始SQL來執行我的查詢。 ADO.Net的東西都被抽象成一個漂亮的幫助器類,這樣我的Finder類就可以簡單地將查詢傳遞給ADO幫助器,該幫助器返回查找器/映射器類轉換爲讀取模型的通用數據對象。
當前,Finder方法(如我的命令存儲庫)通過注入到我的控制器的接口進行訪問,但我想知道接口,DI和IoC是否對查詢方過度殺手,因爲我已經閱讀了有關CQRS的閱讀方建議使用「瘦數據層」。
爲什麼不直接訪問我的Finders?我理解接口和DI的論點。即分離關注點和可測試性。在SOC的情況下,我的DAL已經通過使用映射器類並將ADO.net內容放入輔助類中分離出數據庫特定的邏輯。就測試而言,根據this question單元測試讀取模型不是必需的。
public class PersonController : Controller
{
private IPersonFinder _person;
public PersonController(IPersonFinder person)
{
_person = person;
}
public ActionResult Details(int id)
{
Person person = _person.GetByID(id);
// TODO: Map person to viewmodel
return this.View(viewmodel);
}
}
但是如果你想將一些橫切關注點應用到你的'PersonFinder'上呢?當你將它應用到靜態類時,這將是非常困難的(和很多重複的代碼),而如果一個接口被注入,你可以自由地用裝飾器,代理,攔截器或其他任何模式來包裝該實例在你的工具箱中。 – Steven