查詢 (Query)
上圖中,可以看到Query不是通過DB來查詢,而是通過一個專門用于查詢的Read DB(上圖中的Cache,它不一定是數(shù)據(jù)庫,但為方便起見,下面統(tǒng)稱Read DB),Read DB中的表(方便起見,暫且認(rèn)為這個Read DB是一個RDBMS)是專門針對UI優(yōu)化過的,例如里面可能會有LatestProductListModel(ProductId, ProductName, Price, BrandName, AddedTime)、BestSoldProductListModel(ProductId, ProductName, TotalSold)這樣的表,分別表示最新的產(chǎn)品列表,銷量最好的產(chǎn)品列表(它們其實就相當(dāng)于是View Model)。LatestProductListModel中有一個BrandName的字段,注意,不是BrandId,因此,對于界面中的查詢,幾乎全都可以通過SELECT * FROM [TABLE]這樣的SQL語句來實現(xiàn),可能有少數(shù)Where,但基本沒有Join,這對于界面的加載速度絕對是有利無弊的(其實也是在用空間換時間)。
命令 (Command)
業(yè)務(wù)邏輯大部分都發(fā)生在寫入的時候,例如用戶購買商品提交訂單時,我們要驗證庫存,用戶信息訂單數(shù)據(jù)是否有效等。如果從傳統(tǒng)DDD的角度看,Command類似于Application Service,用戶的命令(如提交訂單)會以Command的形式得到執(zhí)行,而Command中也不會帶有業(yè)務(wù)邏輯,Command中做的事情基本上是:通過Repository得到相關(guān)的領(lǐng)域?qū)ο?,調(diào)用某些領(lǐng)域服務(wù)(Domain Service)執(zhí)行一些操作(業(yè)務(wù)邏輯都將保留在領(lǐng)域模型中),然后執(zhí)行Commit或SaveChanges之類的方法提交改動,之后,相關(guān)的數(shù)據(jù)就會寫入到Write DB中(圖的DB,下文統(tǒng)稱Write DB)。需要注意的是,UI上的查詢都是查Read DB,而不是Write DB。