1
我有一個關於外部集合驗證的問題。何處進行外部驗證驗證?
- 在我們的網域的合作伙伴可以下訂單,其中包含某些產品(1)。
- 一旦下單(2),他可以在我們的系統中將其標記爲已付(3)。
- 將訂單標記爲已付款(4)後,我們將許可證分配給外部圖書館服務(5)中的產品。
- 一旦我們知道許可分配(6),我們關閉整個傳奇。
下面是說明了此過程小拉:
此時除了命令,命令處理程序和事件有一些參與了整個過程中有兩個領域類:
訂單包含業務邏輯的集合 協調整個過程和分配許可的訂單傳奇
現在,在這個過程中有一個不變的模型 - 在我們將訂單標記爲付款之前,我們必須檢查用戶是否還沒有分配特定的許可證。我們也從圖書館服務中獲得這一點。
你會把這個驗證?命令處理?在某些域名服務中封裝訂單?將一些驗證器傳遞給Order構造函數?
class Order
{
public function __construct(OrderValidator $validator)
{
if (!$validator->isValid($this)) {
throw new \DomainException();
}
// else proceed
}
}
class OrderValidator
{
private $libraryServiceClient;
public function isValid(Order $order)
{
// check licence using $libraryServiceClient
}
}
如果你想要一個嚴格的驗證,你可以傳遞一個「服務」,在執行MarkPaid命令的聚合方法中進行驗證,並在更改狀態之前檢查它。 – rascio
我認爲用戶應該是模型的一部分每個訂單都有一個創建它的用戶。然後驗證可以是簡單的,仍然在聚合的一側。 用戶類可以只有一個方法 - > isAllowedToMakePayment()或 - > hasLicence() –
@MohamedBouallegue肯定但許可證檢查實際上是不同有界上下文的一部分,所以它必須在某處被委託 - 我的問題是如何。 – acid