2017-06-29 99 views
1

我有一個關於外部集合驗證的問題。何處進行外部驗證驗證?

  • 在我們的網域的合作伙伴可以下訂單,其中包含某些產品(1)。
  • 一旦下單(2),他可以在我們的系統中將其標記爲已付(3)。
  • 將訂單標記爲已付款(4)後,我們將許可證分配給外部圖書館服務(5)中的產品。
  • 一旦我們知道許可分配(6),我們關閉整個傳奇。

下面是說明了此過程小拉:

enter image description here

此時除了命令,命令處理程序和事件有一些參與了整個過程中有兩個領域類:

訂單包含業務邏輯的集合 協調整個過程和分配許可的訂單傳奇

現在,在這個過程中有一個不變的模型 - 在我們將訂單標記爲付款之前,我們必須檢查用戶是否還沒有分配特定的許可證。我們也從圖書館服務中獲得這一點。

你會把這個驗證?命令處理?在某些域名服務中封裝訂單?將一些驗證器傳遞給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 
    } 
} 
+0

如果你想要一個嚴格的驗證,你可以傳遞一個「服務」,在執行MarkPaid命令的聚合方法中進行驗證,並在更改狀態之前檢查它。 – rascio

+0

我認爲用戶應該是模型的一部分每個訂單都有一個創建它的用戶。然後驗證可以是簡單的,仍然在聚合的一側。 用戶類可以只有一個方法 - > isAllowedToMakePayment()或 - > hasLicence() –

+0

@MohamedBouallegue肯定但許可證檢查實際上是不同有界上下文的一部分,所以它必須在某處被委託 - 我的問題是如何。 – acid

回答

0

據我瞭解問題是在第3步(馬克秩序支付)。在這一步中,我們需要一個用戶(我們稱之爲付款人)將訂單標記爲付款。因此,在創建付款人對象時(可能使用工廠),我們需要知道他是否被允許將訂單標記爲已付款。爲了獲得這些信息,應該打電話給外部圖書館。

我建議有一個應用程序服務->markOrderAsPayed($orderId, $payerUserId) 此方法將調用2個域服務。一個用於獲取付款人,另一個用於將訂單標記爲已付款。

$payer = $this->payerService->getPayer($payerUserId); 
$this->orderService->payOrder($orderId, $payer); 

getPayer()功能,你應該打個電話給外部庫知道付款人如何擁有的許可證數量。

我希望這會有所幫助,它只是基於我從問題和意見中瞭解的內容。