将Masstransit包装成CQRS实施是一种好的做法吗?

时间:2017-09-11 10:59:31

标签: c# message-queue microservices cqrs masstransit

我希望有一个单独的[ { "_id": "59b631cd709fef7c4caf5dee", "name": "ddfdd", "home": { "a1": "f", "a2": "cc", "a3": "ccc", "a4": "gfr" }, "about": { "a5": "fgfffgf", "a6": "fgfg", "a7": "werr" },contact:{ a8:"hfjdfh" a9:"hyyd" } },{ "_id": "4546565756756", "name": "dde", "home": { "a1": "ff", "a2": "cfrc", "a3": "ccdec", "a4": "gfetr" }, "about": { "a5": "feeeffgf", "a6": "tyu", "a7": "ert" },contact:{ a8:"frt" a9:"rty" } },.....] CommandBus以及EventBusICommandHandler<TCommand>,以便IEventHandler<TCommand>类看起来像:

OrderEventHandler

一种可能的解决方案是在public class OrderEventHandler : IEventHandler<OrderPlaced>, IEventHandler<OrderRegistrantAssigned>, IEventHandler<OrderTotalsCalculated>, IEventHandler<OrderConfirmed>, IEventHandler<OrderExpired>, IEventHandler<SeatAssignmentsCreated>, IEventHandler<SeatAssigned>, IEventHandler<SeatAssignmentUpdated>, IEventHandler<SeatUnassigned> { public void Handle(OrderPlaced @event){...} . . . } 基础架构和我的Masstransit之间提供一个采用者(如CQRS,它只公开我通常需要的上下文详细信息。)

但是因为我是ConsumerToHandlerAdopter<T>的新手,所以我无法理解我以后可能需要处理的问题。

所以我的问题是: 一般来说,包装Masstransit是否值得我处理自己的基础设施?

1 个答案:

答案 0 :(得分:2)

我们使用MassTransit广泛实现CRQS,但仅用于命令处理。

多次讨论不使用消息传递基础结构来同步写入和读取模型的原因。主要原因是您有机会坚持更改并且不发布事件,因为这些是两个不同的基础架构。除非您使用类似DTC的东西,否则您将无法保证模型之间的一致性。

此外,在这一点上,我们也更愿意远离“上帝处理者”类。 MassTransit特别擅长通过将每个消费者分成一个单独的类来实施SRP(单一责任原则)。

对于基于事件的一般集成(反应事件处理),我们也使用MassTransit。

您还可以拥有实现多个消息界面的事件,这样您就可以进行更全面的事件处理:

public interface CustomerRegistered
{
    string FullName { get; }
}

public interface OrderPlaced
{
    string Reference { get; }
    List<OrderLine> Lines { get; }
}

public class NewCustomerOrderedStuff : CustomerRegistered, OrderPlaced
{
...
}

public class CustomerRegisteredConsumer : IConsumer<CustomerRegistered>

public class OrderPlacedConsumer : IConsumer<OrderPlaced>

每个消费者都会有不同的关注,并且可以生活在一个独立的有限环境(服务)中。