NServiceBus Ненавязчивые соглашения Определение команд как несколько раз

Кажется, я не могу определить команды / соглашения о событиях более одного раза. Каждое зарегистрированное соглашение будет отменять предыдущее.

Это работает:

 configuration.Conventions()
            .DefiningCommandsAs(
                type => type.FullName == "MyProject1.CommandA" || type.FullName == "MyProject2.CommandB");

Но это не так:

        configuration.Conventions()
            .DefiningCommandsAs(
                type => type.FullName == "MyProject1.CommandA");

        configuration.Conventions()
            .DefiningCommandsAs(
                type => type.FullName == "MyProject2.CommandB");

Зачем мне это нужно:

Я разрабатываю пакет, который когда-то упоминается в проекте NSB будет выполнять периодические действия (отправлять сообщения). Необходимо определить собственные соглашения о командах в INeedInitialization который будет подхвачен во время сканирования сборки. Я не хочу, чтобы пользователь пакета знал, что ему нужно зарегистрировать соглашения пакета. Однако хост-проекту необходимо зарегистрировать собственные соглашения для команд. Таким образом, в настоящий момент мне нужно либо прибегнуть к интерфейсам Marker (что я не хочу делать, есть веская причина, по которой был введен ненавязчивый режим), либо придумать соглашения, согласно которым все команды должны находиться в *.Commands. * пространство имен, которое мне тоже не нравится.

Таким образом, вопрос заключается в том, как заставить пакет регистрировать свои собственные соглашения ненавязчиво и прозрачно для хоста.

редактировать

Еще один способ, которым я могу подумать о том, чтобы взломать эту проблему, - реализовать синглтон общей конвенции и делегировать ей регистрацию конвенций. Этот синглтон запомнит все условные обозначения и будет добавлять их каждый раз. Не красиво, но не страшнее, чем другие 2 варианта.

1 ответ

Соглашения о сообщениях, не поддерживающие множественные вызовы, определенно разработаны. Это сделано для того, чтобы не иметь несколько мнений о том, что сообщение может быть Их аддитивность подразумевает, что любой может иметь мнение.

Таким образом, этот шаблон предназначен для того, чтобы обеспечить трение против всего этого, чтобы вы могли согласиться с одним определением того, что означает Command во всей системе. По сути, SOA Tenet #4: совместимость сервисов основана на политике. Часто это "пространство имен, оканчивающееся на .Commandsобразец, я использовал это лично, и это работает хорошо.

Я работаю на Particular, так что, хотя ничто не стоит на месте, я могу быть достаточно уверенным в том, что нет никаких планов изменить это в V6.

Если вам абсолютно необходимо сделать что-то другое, ваша идея в вашем редакторе о создании какой-то MessageRegistry синглтон и имеющий делегат конвенции MessageRegistry.IsCommand(Type) совершенно верно. В V5 ничего не будет выполняться до тех пор, пока шина не запустится до тех пор, пока MessageRegistry не заполнится перед запуском шины (что также может быть выполнено изнутри). INeedInitialization) тогда все должно работать отлично.

Если вы пойдете по этому пути, я бы посоветовал вам пройти весь путь и поручить вашему единственному реестру отвечать за другие метаданные, такие как TimeToBeReceived, DataBus, WireEncryptedString, Express и любые другие метаданные сообщений на основе атрибутов.

Другие вопросы по тегам