2016-07-14 22 views
0

Ich benutze CQRS mit Event Sourcing und ich versuche, das Zustandsmuster mit meinem aggregierten Stamm zu verwenden.Zustandsmuster mit CQRS und Ereignis-Sourcing

Ich habe derzeit ein Produkt-Domain-Modell mit ein paar Methoden namens Create() und CreateSubscription wie unten.

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

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

Dann habe ich die privaten Methoden, die tatsächlich die Werte wie folgt setzt.

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

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

Wenn ich den Zustand Muster verwendet haben, bevor die Logik DDD wurde in die Zustandsklasse bewegt, sondern weil ich Ereignis Sourcing verwende ich brauche die Wenn-Methode aufrufen, die in einer Basisklasse ist, die ruft dann meine private 'On' Methoden, die die Werte tatsächlich setzen.

Ich frage mich, wie ich diese Logik in meine State-Klasse umwandeln kann, sonst hat meine State-Class momentan nur 'Can'-Methoden und nicht den eigentlichen Implementierungscode.

+0

Was ist das 'When' Schlüsselwort? Ist es neu in der neuesten C# Version. 6.0? – niksofteng

+0

Wann ist eine Methode auf meiner Basisklasse – user1180223

+0

Ich weiß, dass Sie sarkastisch sind, aber ich mag es sehr. Es liest sich auch als ein Satz mit dem Typ des übergebenen Objekts 'Wenn ein neues Produkt erstellt wurde' – user1180223

Antwort

0

Können Sie nicht einfach Dinge in _productState übergeben?

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

Zum Beispiel:

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

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

Oder

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

public void OnSomeEventThatNeedsToCheckTheState(string name) 
{ 
    if (_productState.CanCreateSubscription())  
     _subscriptions.Add(Subscription.Create(name)); 
}