【问题标题】:how to access endpoint configuration in a custom NServiceBus profile handler如何在自定义 NServiceBus 配置文件处理程序中访问端点配置
【发布时间】:2015-12-15 12:53:07
【问题描述】:

我正在将代码从 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&lt;T&gt; 接口的来源。

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

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

IHandleProfile 现在传递了Configure 的实例

(这对我的情况来说是完美的),但据我所知,这不是真的(没有Configure 传递给ProfileActivated(),我看不出如何注入它)。

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

【问题讨论】:

    标签: nservicebus nservicebus5


    【解决方案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 中设置的内容,您可以执行以下操作(即获取端点名称):

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

    【讨论】:

    • 不幸的是,无论我是否使用configuration.EndpointName("MyEndpointName") 明确设置端点名称,这都会引发KeyNotFoundException: The given key (EndpointName) was not present in the dictionary.。我没有在我的问题中提到它,但我已经尝试过这种方法。我还找到了this excellent post by Yogiraj Aradhye,这证实了不能让这个工作的不仅仅是我。
    • 刚刚检查过。这是 NServiceBus.Core 中的一个错误。您只需要访问端点名称吗?我可以为您提供一个令人讨厌的解决方法
    • 看起来是一个聪明的解决方法,稍后会尝试一下。
    • 顺便说一句,如果这是一个错误,那么它是否已经在他们的 github 存储库中报告了?
    【解决方案2】:

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

    【讨论】:

    • 就像我已经解释过的那样,IWantTheEndPointConfig 在 NSB v5 中已被弃用(错误=true,因此它甚至无法编译)。您链接到的文档已过时(我已经通过他们的反馈表向 Particular 报告了这一点)。
    • @JakubJanuszkiewicz 抱歉,我看错了。我刚刚检查过,就我而言,这是可行的,但是很奇怪,您没有强制使用这两种方法,因为它们已经在标准界面中。如果您使用的是旧版本,也许升级到最新版本可能会有所帮助。看起来他们的文档实际上是正确的,但在您的环境中有些不同。
    • 你从哪里引用IHandleProfile?不是this interface from NServiceBus.Host吗?它只有一种方法:void ProfileActivated(BusConfiguration config);
    • 我从 Azure Hosting 项目中引用了这个,这显然没有意义。我认为正常托管会是相似的。如果您查看 ProfileManager,您会发现除了您已经拥有的 BusConfiguration 之外,他们确实无法获得其他任何东西。不好意思,在正常的NServiceBus中好像是不行的。
    • 好的,现在很清楚了。我正在使用托管信息更新问题,我没有意识到他们为不同的托管场景提供了如此不同的 API。无论如何,我很感激你的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-26
    • 1970-01-01
    • 2010-10-20
    • 2013-01-21
    • 2011-05-04
    • 1970-01-01
    相关资源
    最近更新 更多