如何在自定义NServiceBus配置文件处理程序

时间:2015-12-15 12:53:08

标签: nservicebus nservicebus5

我将代码从NSBv4迁移到NSBv5(准确地说是5.2.12)并且我有一个自定义配置文件实现:

public class MyProfileHandler : IHandleProfile<PerformanceCounters>
{
    public MyProfileHandler()
    {

    }

    public void ProfileActivated(BusConfiguration config)
    {
        // I need to do something based on endpoint configuration, e.g. endpoint name
        // this used to work in NSBv4:
        // var endpointName = Configure.EndpointName;
    }
}

如何在此处访问端点配置?

我使用NServiceBus.Host托管此应用程序(如果重要的话是v6.0.0),这就是IHandleProfile<T>界面的来源。

BusConfiguration是一个配置构建器,似乎无法从中读取任何有用的东西。我试图将Configure的实例注入我的配置文件处理程序的构造函数,但随后崩溃 - NSB需要处理程序具有无参数构造函数。

实现IWantTheEndpointConfig也不是一个选项,因为它在v5中已弃用,并且会导致编译错误。其过时的错误消息指出:

  

IHandleProfile现在传递了Configure

的实例

(这对我的情况来说是完美的),但据我所知,这是不正确的(没有Configure传递给ProfileActivated(),我无法看到我的情况可以注射它。)

我唯一的选择是使用完全不同的方法重新实现配置文件处理程序,还是我错过了什么?

2 个答案:

答案 0 :(得分:1)

NServiceBus.Core有一个问题,它如何在BusConfiguration上设置端点名称(不幸的是端点版本)。设置的端点名称太晚了添加到设置字典中。您可以通过执行以下操作来解决该问题:

public class EndpointConfig : IConfigureThisEndpoint
{
    public void Customize(BusConfiguration configuration)
    {
        var customConfig = new EndpointConfiguration
        {
            EndpointName = "YourEndpointName",
        };

        configuration.EndpointName(customConfig.EndpointName);

        configuration.GetSettings().Set<EndpointConfiguration>(customConfig);
    }
}

public class EndpointConfiguration
{
    public string EndpointName { get; set; }
}

BusConfiguration本质上是关于类固醇的字典。如果要访问配置文件处理程序中BusConfiguration中设置的内容,可以执行以下操作(i.ex.获取端点名称):

public class MyProfileHandler : IHandleProfile<PerformanceCounters>
{
    public void ProfileActivated(BusConfiguration config)
    {
        var customConfig = config.GetSettings().Get<EndpointConfiguration>();
        var endpointName = customConfig.EndpointName;
    }
}

答案 1 :(得分:0)

在普通的NServiceBus主机中,该接口仅提供一个参数BusConfiguration。在Azure上,该接口提供了两种方法,其中一种方法实际上具有Configure对象。