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 и любые другие метаданные сообщений на основе атрибутов.