Moh*_*sen 5 c# masstransit message-queue cqrs microservices
我宁愿有一个单独的CommandBusand EventBusand also ICommandHandler<TCommand>andIEventHandler<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){...}
.
.
.
}
Run Code Online (Sandbox Code Playgroud)
一个可能的解决方案是在Masstransit基础设施和我的之间提供一个采用者CQRS(比如ConsumerToHandlerAdopter<T>它只公开我通常需要的上下文细节)。
但是由于我是 新手Masstransit,我无法解决以后可能需要处理的问题。
所以我的问题是: 通常是否值得包装 Masstransit 以便我处理自己的基础设施?
我们使用 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>
Run Code Online (Sandbox Code Playgroud)
每个消费者都会有不同的关注点,并且可以生活在单独的有界上下文(服务)中。
| 归档时间: |
|
| 查看次数: |
2508 次 |
| 最近记录: |