Шаблон состояния с CQRS и источником событий

Я использую CQRS с Event Sourcing, и я пытаюсь использовать шаблон состояния с моим совокупным корнем.

В настоящее время у меня есть модель предметной области с парой методов, называемых 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, логика была перемещена в класс состояний, но поскольку я использую источник событий, мне нужно вызвать метод When, который находится в базовом классе, который затем вызывает мои частные методы On, которые фактически устанавливают ценности.

Мне было интересно, как перенести эту логику в мой класс состояний, иначе в данный момент в моем классе состояний есть только методы Can, а не реальный код реализации.

1 ответ

Разве вы не можете просто передать вещи в _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));
}
Другие вопросы по тегам