c# - NServiceBus 自定义消息处理程序类型

标签 c# nservicebus

NServiceBus 中是否有一种方法可以用我自己的与 NServiceBus 没有强关联的接口(interface)版本来替换 IHandleMessages<> 处理程序?

我找到了替换事件/命令标记接口(interface)的方法(通过 NServiceBus 3 Unobtrusive 语法),但没有办法对实际处理程序执行相同的操作。我试图这样做是为了消除我的处理程序和 NServiceBus 之间的耦合。

最佳答案

我发现只需很少的代码就可以实现:

1) 创建一个实现 IHandleMessages<TMessage> 的泛型类并实现 Handle 方法,使其找到或创建自定义处理程序的正确实例(来自 DI 容器、静态注册表等)。在此示例中,假设您有 MyCustomHandlervoid 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 将路由 MyMessage1MyMessage2通过开放通用IHandleMessages<TMessage>然后将处理委托(delegate)给您的自定义类。

关于c# - NServiceBus 自定义消息处理程序类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9027662/

相关文章:

python - 无法从NumSharp.NDArray转换为OpenCvSharp.InputArray

c# - 在 C# 中停止服务器端函数

web-services - 良好的服务层开发和设计 : What are the common bad practices in communications tier development?

NServiceBus:使用 NServiceBus Distributor 的优缺点

azure - NServiceBus 和 Azure 长时间运行处理程序模式

json - NServiceBus:人类可读的消息体

c# - 您将加密 key 放在面向公众的服务器上的什么位置?

c# - MVC HttpPost 强类型模型 null

c# - 在(不相关的?)事务中使用 IsolationLevel.ReadUncommitted 时,SqlDependency 订阅不起作用

c# - 将我的 View 模型绑定(bind)到 View 会导致选中所有复选框