您的描述相当不完整,因此此答案也可能不完整。
根据您的描述 -
我在域端有一个订阅者,它监听这个事件。我的计划是检索订阅者中的所有看门狗并调用方法 watchdog.ShouldBark(triggerId, value)。
我可以在您的域设计中闻到一些非常糟糕的东西。 ShouldBark 方法的目的是什么。它必须更改您的 WatchDog 域的状态。如果是这样,你就走错了方向。
让我们先获取您的业务域。 触发器、条件、条件组、看门狗。
我有一个条件聚合根,它引用了一个 triggerId(触发器聚合根)。
所以,触发器聚合中的代码应该如下所示(您可能发现我的一些代码是伪代码)-
public class Trigger : AggregateRoot
{
...
public void CreateTrigger(int value)
{
//You can also pass new guid for trigger from your service
Guid triggerId = Guid.NewGuid();
var @event = new TriggerReceived(triggerId, value);
PublishEvent(@event);
}
}
//this is your event
public class TriggerReceived
{
public readonly int Value;
public readonly Guid TriggerId;
public TriggerReceived(Guid triggerId, int value)
{
Value = value;
TriggerId = triggerId;
}
}
现在进入正确的方向。将您的 Condition 服务订阅到此事件,而不是检索所有 watchDog。
public class ConditionService
{
public void When(TriggerReceived @event)
{
//re-hydrate your condition aggregate root from event store
var condition = getConditionByTriggerId(@event.TriggerId);
//if you want to retrieve condition based on Value you can do that here
//var condition = getConditionByValue(@event.Value);
if(condition is not null)
condition.MatchTrigger();
}
}
然后在您的 Condition 聚合中 -
public class Condition : AggregateRoot
{
...
public void MatchTrigger()
{
//your business logic here
...
//we know trigger value matched one condition, so raise the next event
publish(new TriggerConditionMatched(this));
}
}
//this is your TriggerConditionMatched event
public class TriggerConditionMatched
{
public readonly Condition Condition;
public TriggerConditionMatched(Condition condition)
{
Condition = condition;
}
}
基于此——
我还有一个 conditionGroup 聚合根,它包含一个 conditionIds 列表。
我们也可以说,每个条件都应该有一个名为ConditionGroupId的属性。订阅您的 ConditionGroup 服务以收听上述事件 -
public class ConditionGroupService
{
public void When(TriggerConditionMatched @event)
{
//re-hydrate your condition group aggregate root from event store
var conditionGroup = getConditionGroup(@event.Condition.GroupId);
if(conditionGroup is not null)
conditionGroup.MatchTriggerToConditionGroup();
}
}
public class ConditionGroup : AggregateRoot
{
...
public void MatchTriggerToConditionGroup()
{
...
//do some check here, your business logic
//raise the next event
publish(new TriggerConditionGroupMatched(this));
}
}
//this is your TriggerConditionGroupMatched event
public class TriggerConditionGroupMatched
{
public readonly ConditionGroup ConditionGroup;
public TriggerConditionGroupMatched(ConditionGroup conditionGroup)
{
ConditionGroup = conditionGroup;
}
}
最后,基于此——
我有一个看门狗聚合根,它包含一个 conditionGroupId。
您的 ConditionGroup 域中应该有一个 watchDogId 属性。所以,订阅你的 WatchDog 服务来监听 TriggerConditionGroupMatched 事件 -
public class WatchDogService
{
public void When(TriggerConditionGroupMatched @event)
{
//re-hydrate your Watch Dog aggregate root from event store
var watchDog = getWatchDog(@event.ConditionGroup.WatchDogId);
if(watchDog is not null)
watchDog.Bark();
}
}
public class WatchDog : AggregateRoot
{
...
public void Bark()
{
...
this.ShouldBark = true;
//you should raise your next event
publish(nextEvent);
}
}
您可能已经发现这是一个由事件和订阅者组成的网络,但请记住,事件源系统应该始终保持一致。通过这种方式,您可以记录 Trigger 或 Condition 或 ConditionGroup 或 WatchDog 发生的所有事情。 p>