2015-04-05 39 views
2

通過我在實現CQRS/ES(我意識到它們不一定相互綁定)中所做的研究,我還沒有看到完整的對象傳遞給一個命令。在應用CQRS/ES時傳遞完整對象

例如,爲什麼我不應該採取的參數,請錯誤一個bug跟蹤API中,像這樣:

[HttpPost] 
public IActionResult CreateBug([FromBody] Bug bug) 
{ 
    if (!ModelState.IsValid) { 
     return new HttpStatusCodeResult(400); 
    } else 
    { 
     commandHandler.Handle(new OpenBug(bug)); 

     return new HttpStatusCodeResult(201); 
    } 
} 

OpenBug是命令:

public class OpenBug : ICommand 
{ 
    public Guid Id { get; set; } 
    public Models.Bug NewBug { get; set; } 

    public OpenBug(Models.Bug bug) { 
     Id = Guid.NewGuid(); 
     NewBug = bug; 

     //Create BugOpened Event here (and add to event sequence?) 
    } 
} 

從我所看到的情況來看,它的處理方式通常是這樣的:

commandHandler.Handle(new OpenBug(bug.Description, bug.Fixed)); 

然後在別處構建。

這是否有特定的原因?當然,我在這裏錯過了一些東西,或者做錯了一些事情。

回答

1

假設Bug是一個具有各種屬性或字段的複雜類,每個這些具有其他屬性和字段的自定義類型等,都會給客戶端帶來相當大的負擔,以便將整個對象圖提供給打開一個錯誤。

你可以在這裏申請Postel's law:如果你需要打開一個錯誤是,例如一個bug ID,什麼都放在一個莫須有的約束在客戶端上。你會讓API更難使用。這不符合基於任務的UI的CQRS理想

a white paper that sometimes can be hard to find on the internet中,Greg Young解釋了在應用層之間來回傳輸大型DTO的問題。

+0

謝謝。它具有很大的意義,以這種方式來看待它。 – 2015-04-05 22:16:05