Шаблон Nservicebus Singleton - подключить к уже существующим объектам - PullRequest
1 голос
/ 06 декабря 2010

Я прорабатываю первые шаги по выяснению Nservicebus и планирую достаточно крупномасштабное (по крайней мере для меня) приложение.

Я хочу, чтобы приложение могло масштабироваться на X-машинах.Он будет иметь ряд служб, таких как:

LogonService UserManagementService GameService RoomService и т. Д. *

Клиенты будут общаться с сервером через WCF.Сами сервисы будут общаться друг с другом через NServiceBus и MSMQ. Саша Барбер написал отличную статью о том, как начать работу с NServiceBus, и столкнулся с той же ситуацией, с которой я столкнусь.Об этом здесь идет еще один разговор между Уди и Сашей.

Мой вопрос: когда служба обрабатывает сообщение, как она узнает об остальном приложении в этой службе?Как говорит Саша, «обработчик будет автоматически» появляться, когда сообщение должно иметь дело с.Итак, когда он создан, как он узнает о других объектах, которые уже запущены и работают.Например, в GameService у него будет список всех игр, запущенных в данный момент.Как бы он получил к этому доступ?

Я думаю, что я могу придумать два варианта (как указал Саша):

Паттерн-посредник Синглтон

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

Является ли это подходящим использованием шаблона Singleton (как вы часто видите людей, называющих Singleton как «Дьявола»,Я не хочу пропустить его, если это возможно).

Есть ли лучшее решение этой проблемы?

Спасибо

Ответы [ 2 ]

2 голосов
/ 07 декабря 2010

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

public Handle(SomeMessage msg)
{
   var aggregateRoot = writeStore.Get(msg.SomeId);

   aggregate.DoSomeAction(msg.SomeOtherData);

   //if write store does not support dirty tracking
   writeStore.Save(aggregateRoot);
}
0 голосов
/ 09 декабря 2010

Синглтоны довольно ужасны, если вы хотите проводить юнит-тесты среди прочего. NServiceBus использует Spring (по умолчанию) в качестве среды внедрения зависимостей при инициализации обработчиков сообщений. В идеале вы должны подключиться к Spring самостоятельно и зарегистрировать свои объекты, чтобы их можно было вводить через. весна.

Сказав это, Singletons - это простой способ достичь того, чего вы хотите. Однако, если единственная причина, по которой вы делаете объект одиночным, заключается в том, что NServiceBus имеет к нему доступ, я бы посоветовал найти лучший способ сделать это.

...