как получить доступ к конфигурации конечной точки в пользовательском обработчике профиля NServiceBus

Я переношу код с 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(), и я не вижу, как я могу его внедрить).

Является ли мой единственный вариант переопределить обработчик профиля, используя совершенно другой подход, или я что-то упускаю?


person Jakub Januszkiewicz    schedule 15.12.2015    source источник


Ответы (2)


У 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;
    }
}
person Daniel Marbach    schedule 18.12.2015
comment
К сожалению, это выдает KeyNotFoundException: The given key (EndpointName) was not present in the dictionary. независимо от того, устанавливаю ли я имя конечной точки явно с помощью configuration.EndpointName("MyEndpointName") или нет. Я не упомянул об этом в своем вопросе, но я уже пробовал этот подход. Я также нашел отличный пост Йогираджа Арадье что подтверждает, что не только я не могу заставить это работать. - person Jakub Januszkiewicz; 18.12.2015
comment
Только что проверил. Это ошибка в NServiceBus.Core. Вам нужен только доступ к имени конечной точки? Я могу предоставить вам неприятный обходной путь - person Daniel Marbach; 18.12.2015
comment
Похоже на умный обходной путь, попробую позже. - person Jakub Januszkiewicz; 18.12.2015
comment
Кстати, если это ошибка, то о ней уже сообщалось в их репозитории на github? - person Jakub Januszkiewicz; 18.12.2015

В обычном хосте NServiceBus интерфейс предлагает только один параметр, BusConfiguration. В Azure интерфейс предлагает два метода, один из которых фактически имеет объект Configure.

person janpieter_z    schedule 15.12.2015
comment
Как я уже объяснял, IWantTheEndPointConfig устарел в NSB v5 (с error=true, поэтому он даже не компилируется). Документация, на которую вы ссылаетесь, устарела (я уже сообщил об этом в частности через форму обратной связи). - person Jakub Januszkiewicz; 15.12.2015
comment
@JakubJanuszkiewicz Извините, я неправильно понял. Я только что проверил, и на моей стороне это работает, но странно, что вы не делаете эти два метода обязательными, поскольку они уже есть в стандартном интерфейсе. Возможно, обновление до последней версии может помочь, если вы используете более старую версию. Кажется, их документы на самом деле верны, но в вашей среде что-то не так. - person janpieter_z; 15.12.2015
comment
Откуда вы ссылаетесь на IHandleProfile? Разве это не этот интерфейс от NServiceBus .Хост? У него есть только один метод: void ProfileActivated(BusConfiguration config);. - person Jakub Januszkiewicz; 15.12.2015
comment
Я сослался на это из проекта Azure Hosting, что, очевидно, не имеет смысла. Я предполагал, что это будет аналогично для обычного хостинга. Если вы посмотрите в ProfileManager, вы увидите, что они действительно не могут получить ничего, кроме BusConfiguration, который у вас уже есть. Извините, кажется, что это невозможно в обычном NServiceBus. - person janpieter_z; 15.12.2015
comment
Хорошо, теперь ясно. Я обновляю вопрос информацией о хостинге, я не знал, что они предоставляют такие разные API для разных сценариев хостинга. Я ценю ваш ответ в любом случае. - person Jakub Januszkiewicz; 16.12.2015
comment
@JakubJanuszkiewicz Я бы посоветовал попытаться связаться с самими парнями из NServiceBus. Обычно они проводят разведку для StackOverflow, но это может просто проскользнуть. Вы можете поднять это как возможную проблему в своих репозиториях, поскольку это явно не соответствует документации! - person janpieter_z; 16.12.2015