2016-07-14 16 views
0

イベントソーシングでCQRSを使用していて、集約ルートで状態パターンを使用しようとしています。CQRSとイベントソーシングを使用した状態パターン

私は現在、以下のようにCreate()とCreateSubscriptionというカップルメソッドを持つ製品ドメインモデルを持っています。

public static void Create(string name){   
    When(new ProductCreatedEvent { Name = name}); 
} 

public void CreateSubscription(string name){   
    if(_productState.CanCreateSubscription()){ 
     When(new SubscriptionCreatedEvent { Name = name}); 
    }   
} 

次に、以下のような値を実際に設定するプライベートメソッドがあります。

private void OnCreated(ProductCreatedEvent e){ 
    _name = e.Name; 
} 

private void OnSubscriptionCreated(SubscriptionCreatedEvent e){ 
    _subscriptions.Add(Subscription.Create(e.Name)); 
} 

私はその後、私のプライベートを呼び出し、基本クラスである場合にはメソッドを呼び出す必要がロジックが状態のクラスに移動されたDDDを使用しますが、私はイベントソーシングを使用していますので、前の状態のパターンを使用していました実際に値を設定する 'On'メソッド。

私の状態クラスにそのロジックを移動する方法が不思議でした。そうでなければ、私の状態クラスには実際の実装コードではなく「Can」メソッドしかありません。

+0

この 'When'キーワードとは何ですか?最新のC#版では新しいですか? 6.0? – niksofteng

+0

私の基本クラスのメソッドはいつですか? – user1180223

+0

私はあなたの皮肉なことを知っていますが、私はそれが大好きです。また、 '新しい製品が作成されたときに'オブジェクトが渡されている文章として読み込みます。 – user1180223

答えて

0

あなたは_productStateに物事を渡すことはできませんか?

private void OnSomeEvent(SomeEvent e){ 
    _productState.Something(); // pass in e? 
} 

例えば:

public void CreateSubscription(string name){   
    _productState.CreateSubscription(name); 
} 

public class ProductState 
{ 
    public void CreateSubscription(string name) 
    { 
     if (this.CanCreateSubscription()) 
     { 
      _subscriptions.Add(Subscription.Create(name)); 
     } 
    } 
} 

それとも

public void OnSomeEventThatMeansYouCanCreateASubscription(string name) 
{ 
    _productState.EnableCreateSubscription(name);  
} 

public void OnSomeEventThatNeedsToCheckTheState(string name) 
{ 
    if (_productState.CanCreateSubscription())  
     _subscriptions.Add(Subscription.Create(name)); 
} 
関連する問題