我想听听您对最近几天困扰我的主题的看法。
在我们的项目中,我们使用 MassTransit 服务总线。我们使用 IoC 容器创建 IServiceBus(MassTransit 的接口)的单例实例,所有需要此 IServiceBus 的类都在构造函数中获取它。这导致我们项目中的很多类都获取了IServiceBus作为构造函数参数,这使得它们与MassTransit服务总线耦合在一起,实际上达到了使用消息队列通知的概念。
我认为这是耦合的一个坏例子。
通过将 IServiceBus 传递给各种类,我们定义了该类向外部侦听器发送通知的方式,并强制该方式成为面向服务总线的方式。
我认为 .NET 的经典方式更好——该类应该在其接口中使用 .NET 事件处理程序定义一个事件,并且任何想要使用此事件处理程序的观察者都应该订阅它。
我们以这种方式获得的是,我们不致力于实现具有服务总线的类。这样,服务总线可以成为该类事件处理程序的观察者,并且当该事件发生时,它会引发将一些消息发送到服务总线队列的逻辑。
这也提出了一个大问题。
鉴于项目在单个进程上运行,我们何时以及为什么应该在项目中使用服务总线?
如果项目由多个进程组成,我可以看到优势,因为使用消息队列更容易传递强类型消息,但是当它在一个进程范围内时,我无法理解它的好处。如果我想让类通知观察者、消费者等,我会在类中引发一个事件,并创建一个单独或封闭的调度程序类组,这些类将订阅我的项目中的所有这些事件,这样我就可以处理消息传输的逻辑。此外,通过这种方式,添加观察者的逻辑将集中在项目中的一个位置。
我很高兴听到你对这个问题的看法。
盖伊