2015-12-10 4 views
1

Кажется, что я не могу определить соглашения команд/событий более одного раза. Каждое зарегистрированное соглашение отменяет предыдущие.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 варианта.

+0

Извините, я не думаю, что здесь есть какие-либо опции помимо двух упомянутых вами (пространство имен маркеров и команд). Я бы пошел с условным обозначением пространства имен команд. –

+0

@TylerDay спасибо, вот что я подозревал. Любая подсказка, если конкретно планирует исправить это в v6? –

+0

То, что я не знаю, но если бы я должен был догадаться, я бы сказал, что это, вероятно, по дизайну, а не ошибка. Однако было бы неплохо. –

ответ

4

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

Таким образом, этот шаблон призван обеспечить трение против этого, чтобы вы согласились с одним определением того, что Команда означает внутри всей системы. В принципе, SOA Tenet # 4: совместимость службы основана на политике. Много раз это «пространство имен, заканчивающееся на .Commands» pattern; Я использовал его лично, и он работает хорошо.

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

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

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

+0

Дэвид, спасибо за ваш ясный ответ, я пытался выяснить, как вы достигли этого в своем собственном пульте управления ServicePulse? Команда EndpointHeartbeat не помечена интерфейсом, а также не в некотором пространстве имен .Commands. Есть ли какая-то внутренняя хитрость? https://github.com/Particular/ServiceControl.Plugin.Nsb5.Heartbeat –

+0

Мы используем транспортные интерфейсы обмена сообщениями более низкого уровня для сообщений плагина ServiceControl, поэтому они не включены в общий пул сообщений на уровне кода пользователя. Они также являются внутренними классами, и вы не можете отправить EndpointHeartbeat самостоятельно. –