2009-07-28 4 views
0

Первоначально я собирался реализовать шаблон наблюдателя в C# 3.0 для решения моей проблемы, хотя он не будет реализован точно так же.Альтернативный шаблон проектирования для наблюдателя .Net

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

В настоящее время у меня есть интерфейс IObserver, который должен был бы реализовать несколько методов Update() на основе того, кто отправляет сообщение и как он это делает.

Я также смотрел на образец медиатора, но я не думаю, что это правильно, потому что подходят экземпляры посредника не будет иметь список тех, кто в настоящее время вошли в систему.

Я теперь интересно, если есть это еще один установленный шаблон дизайна, который был бы более подходящим, или если бы мне просто нужно было построить мой текущий шаблон Observer, чтобы он соответствовал моим потребностям.

Благодаря

+0

Эта статья о msdn дала мне лучшее представление о том, что объясняется ниже. http://msdn.microsoft.com/en-us/library/ms954621.aspx – CountCet

ответ

6

не могли бы вы реализовать его с помощью событий/делегатов? Это стандартный способ реализации шаблона Observer в C# и других языках .Net.

+0

+1. Это правильный способ сделать это. – Brian

+0

События могут быть самой ранней реализацией «наблюдателя», но они недостаточно во многих отношениях. Хуже всего это отсутствие какого-либо хорошего механизма для работы с жизнью подписки, если издатель или абонент отказался [подписка должна стать недействительной, если либо издатель, либо абонент оставлен]. Другие шаблоны могут обеспечить механизмы для облегчения этих проблем. – supercat

+0

@supercat - В 2009 году в BCL не было реактивных расширений, не было 'Obeserver' /' Observable', а событиями было это, если вы не хотели разворачивать свои собственные. – Oded

3

Не являются ли события .Net незаменимыми шаблонами наблюдателей? :) У вас может быть класс, скажем, «Статистика», и этот класс выставляет событие OnUpdate().

+1

Нужно, чтобы делегировать делегата вашего мероприятия перед тем, как его вызвать, поражает меня, как заставить вас заглянуть через плечо, чтобы убедиться, что кто-то смотрит на вас. Это выглядит довольно странно концептуально. – xyz

+0

Согласовано, всегда это ненавидило :) – cwap

+0

@ al7ut9ov8my4wopt5ur6ais5: Предоставление поля поддержки для делегата события дается с тем же именем, что и само событие IMHO является серьезным провалом в дизайне C#. В поле backing должно быть указано другое имя, и попытка использовать имя события, например вызов метода, должна автоматически сгенерировать поведение «выполнить, если не null else do nothing»; попытка присвоить значение null имени события или сравнить его с нулевым значением должна работать на поле выпечки. В противном случае имя события не должно рассматриваться как синоним делегата. – supercat

1

C# принял образец дизайна и сделал его гражданином первого класса этого языка. Почему бы просто не использовать то, что предоставляется? Я ничего не вижу в вашем примере, который не может быть выполнен со встроенной структурой событий в C#.

+0

Я не против использования событий, но я не хочу иметь двунаправленную зависимость между пользователем и классом, которые будут внедрять обновление статистики. – CountCet

+0

Нет зависимости. Один класс выдает событие, другой обрабатывает его. Шаблон уменьшает потребность в связях/зависимости между классами. –

+0

@EdS: В правильном шаблоне наблюдателя издатель событий не должен препятствовать сбору мусора подписчику (бывают случаи, когда абонент событий может сделать что-то полезное без какой-либо ссылки, имеющейся на нем, но сегодня это, вероятно, лучше всего обрабатывается путем использования подписчиком «ConditionalWeakTable», чтобы привязать его время жизни к тем вещам, которые могут это волновать). События являются основным источником утечек памяти в .net. – supercat