Шаблон состояния с 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));
}