最近在用CQRS架構模式做項目,有些感悟,記錄下來。
問題的描述(大家是否也存在過類似的情況呢?):
從剛開始時項目中沒有區分這3種對象,所以導致了很多職責公用,然後就亂了,比如Command一部分職責 需要用到ASP.NET MVC中,所以定義在了底層dll中,並且貼了一堆一堆的DataAnnotation的tag到屬性上,其 中包括了很多remote驗證、前端js validation組件的驗證tag,很宏偉。後端CommandHandler那邊傳入 DomainService的dll中,由於對數據轉換還存在誤解,所以也用得一塌糊塗。
我目前的理解:
ASP.NET MVC的Model層不能少,這個是細粒度的對象,和UI有很強的聯系,在這些對象定義上需要貼一堆 驗證tag以及UIHint
Command對象,是牽涉到具體業務行為的對象定義,和UI沒有很大關系(但不代表沒有關系),Command的 名稱、屬性的定義會根據項目的進展而變化,實際上就是看需求變動以及對業務的理解深入而變化,在 Command對象上定義的都是些server端驗證的屬性(順便說一下,A2D框架的CommandBus會在每次 CommandBus.Send後驗證這些Command的合法性)。
DTO,是data transfer object的意思,它所能描述的范圍太寬了,後來發現在CQRS中,DTO主要是指Query DTO。
下面再貼一張CQRS的圖(大家看看能否把上面3種對象對應起來):
查看本欄目