NServiceBus 中是否有一种方法可以用我自己的与 NServiceBus 没有强关联的接口(interface)版本来替换 IHandleMessages<> 处理程序?
我找到了替换事件/命令标记接口(interface)的方法(通过 NServiceBus 3 Unobtrusive 语法),但没有办法对实际处理程序执行相同的操作。我试图这样做是为了消除我的处理程序和 NServiceBus 之间的耦合。
最佳答案
我发现只需很少的代码就可以实现:
1) 创建一个实现 IHandleMessages<TMessage>
的泛型类并实现 Handle 方法,使其找到或创建自定义处理程序的正确实例(来自 DI 容器、静态注册表等)。在此示例中,假设您有 MyCustomHandler
与 void HandleMessageMyWay(object message)
一起上课接受任何消息类型的方法:
public class MessageHandlerAdapter<TMessage>
: IHandleMessages<TMessage>
{
public void Handle(TMessage message)
{
new MyCustomHandler().HandleMessageMyWay(message);
}
}
它是一个开放式泛型,因此 NServiceBus 不会将其发现为有效的处理程序,因为您需要一个封闭式泛型(TMessage 是像 MyMessage1 这样的具体类型)才能被 NServiceBus 视为具体类型的处理程序。
2) 实现ISpecifyMessageHandlerOrdering
。在它的 SpecifyOrder
方法为您想要支持的每种消息类型(在运行时)创建一个封闭的通用适配器类型:
public class MessageHandlerAdapterLister : ISpecifyMessageHandlerOrdering
{
public void SpecifyOrder(Order order)
{
//You would normally iterate through your message types (over DI registry or some other registry of messages):
var adapterType1 = typeof(MessageHandlerAdapter<>).MakeGenericType(typeof(MyMessage1));
var adapterType2 = typeof(MessageHandlerAdapter<>).MakeGenericType(typeof(MyMessage2));
order.Specify(new[] { adapterType1, adapterType2 });
}
}
ISpecifyMessageHandlerOrdering
实例由 NServiceBus 自动发现。这些通常用于指定 NServiceBus 发现的处理程序类型的顺序。显然,当您指定尚未发现的类型(例如我们在运行时创建的封闭通用适配器类型)时,它只会将它们添加到注册表中。
这就是您所需要的。 NServiceBus 将路由 MyMessage1
和MyMessage2
通过开放通用IHandleMessages<TMessage>
然后将处理委托(delegate)给您的自定义类。
关于c# - NServiceBus 自定义消息处理程序类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9027662/