使用 Bus.Send() 并在 Saga Handler 中使用 API 服务



我在下面有这个Saga类代码,问题部分在代码中进行了注释。请注意代码的简化,因为我删除了无处不在的语言和其他细节,以使其易于阅读。

public class MessageSaga : Saga,
    IPointBy<SendMessageCommand>, IHandle<RequestProcessingCommand>
{
    private readonly IServices _services;
    public MessageSaga(IServices services,
        IBus bus, IEventStore eventStore, IRepository repository)
        : base(bus, eventStore, repository)
    {
        _services = services;
    }
    public void Handle(SendMessageCommand message)
    {
        var msg = MessageAggregate.CreateNew(message.Id, message.Text);
        Repository.Save(msg);
        // This is my Question #1
        var request = new RequestProcessingCommand(message.Id, message.Text);
        Bus.Send(request);
    }
    public void Handle(RequestProcessingCommand message)
    {
        var item = Repository.GetById<MessageAggregate>(message.Id);
        // This is my Question #2
        var result = _services.ProcessMessage(message.Text);
        var response = ProcessItem.Generate(item, result );
        Repository.Save(reponse);
    }
}

所以,在上面的代码中,我有两个问题:

在问题 1 中,由于"总线"在 Saga 类中可用,这是使用 Bus.Send() 链接到其他处理程序的正确方法,还是我应该在 Aggregate 类中执行此操作?

与第二个问题一样,我在域外有这个"_services"Web API,这是在处理程序中使用它的正确方法,还是我也应该在聚合类中使用它。

的所有代码都运行良好,我什至没有任何问题地进行负载测试。不知何故,我感到怀疑,因为处理程序应该是简单的事件保存。谢谢。

我的建议是将基础结构问题保留在您的域模型(聚合)之外。 想想洋葱建筑。 基本概念是模型 api 在模型和它运行的上下文之间创建边界。

考虑一下:如果您开始在域模型中引入总线或_service,则对域逻辑的任何测试都需要测试替身,在尝试评估业务逻辑时,您不一定关心这些测试替身。

最新更新