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

时间:2017-02-02 03:13:02

标签: c# architecture event-sourcing saga

我在下面有这个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,因为&#34; Bus&#34;在Saga类中可用,这是使用Bus.Send()链接到其他处理程序的正确方法,还是应该在Aggregate类中进行此操作?

与第二个问题一样,我有这个&#34; _services&#34;域外的Web API,这是在处理程序中使用它的正确方法,或者我也应该在Aggregate类中进行此操作。

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

1 个答案:

答案 0 :(得分:0)

我的建议是将域模型(聚合)中的基础架构问题保留在之外。想想onion architecture。基本概念是模型api在模型与其运行的上下文之间创建边界。

考虑一下:如果您开始在您的域模型中引入总线或_service,那么对您的域逻辑的任何测试都需要您在尝试评估业务逻辑时不必关心的测试双精度。