【问题标题】:Using Bus.Send() and using API services inside Saga Handler使用 Bus.Send() 并在 Saga Handler 中使用 API 服务
【发布时间】:2017-02-03 04:12:10
【问题描述】:

我在下面有这个 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,这是在处理程序中使用它的正确方法,还是我也应该在聚合类中使用它。

我的所有代码都能完美运行,我什至可以毫无问题地进行负载测试。不知何故,我感到怀疑,因为处理程序假设是简单的事件保存。谢谢。

【问题讨论】:

    标签: c# architecture event-sourcing saga


    【解决方案1】:

    我的建议是将基础架构问题放在您的域模型(聚合)之外。想想onion architecture。基本概念是模型 api 在模型和它运行的上下文之间创建了一个边界。

    考虑一下:如果您开始将 bus 或 _service 引入到您的域模型中,那么对您的域逻辑的任何测试都需要测试替身,而您在尝试评估您的业务逻辑时不一定会关心。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-14
      • 1970-01-01
      • 2011-04-23
      • 2014-04-24
      • 1970-01-01
      • 2018-03-03
      相关资源
      最近更新 更多