2009-07-28 11 views
0

私は当初、C#3.0でオブザーバパターンを実装していましたが、私の問題を解決するには全く同じ方法で実装することはできませんでした。Observerの代わりのデザインパターン.Net

私の問題は、メッセージを投稿できるユーザーがいるWebアプリケーションがあることです。通知は他のユーザーに直接送られるのではなく、統計オブジェクトが更新され、ユーザーが統計情報を確認して更新が必要かどうかを判断できる分散キャッシュに送られます。

私は現在、誰がメッセージを投稿しているかに基づいて複数のUpdate()メソッドを実装する必要があるIObserverインターフェイスを持っています。

私もMediatorパターンを見てきましたが、私はメディエーターのインスタンスが現在ログインしている人のリストを持っていないので、それが正しいフィットではないと思います。

私は今、もしそこに疑問に思って私のニーズに合わせて現在のObserverパターンを構築するだけなら、もっと適しているはずです。

ありがとうございます

+0

msdnに関するこの記事では、以下の回答がどのように説明されているかをわかりやすく説明しています。 http://msdn.microsoft.com/en-us/library/ms954621.aspx – CountCet

答えて

6

イベント/代理人で実装できませんか?これは、C#やその他の.Net言語でObserverパターンを実装する標準的な方法です。

+0

+1。これは正しい方法です。 – Brian

+0

イベントは「オブザーバー」の最も初期の実装かもしれませんが、多くの点で欠陥があります。これらの中で最も悪いのは、パブリッシャまたはサブスクライバが放棄された場合にサブスクリプションの存続期間を処理するための適切なメカニズムがないことです(パブリッシャまたはサブスクライバのいずれかが放棄された場合、サブスクリプションは無効になります)。他のパターンは、これらの問題を緩和するためのメカニズムを提供することができる。 – supercat

+0

@supercat - 2009年には、BCL内に「Obeserver」/「Observable」という反応拡張はありませんでした。あなたが自分自身を展開する気にならなかった場合は、イベントでした。 – Oded

3

.Netイベントは、偽装のオブザーバーパターンではありませんか? :)あなたはクラス、例えばStatisticを持つことができ、そのクラスにOnUpdate()イベントを公開させることができます。

+1

イベントのデリゲートを呼び出す前にヌルチェックすると、誰かがあなたを見ていることを確実にするために、あなたの肩を見渡すように強制されます。概念的にはかなり変わっているようです。 – xyz

+0

同意、常にそれも嫌い:) – cwap

+0

@ al7ut9ov8my4wopt5ur6ais5:イベントデリゲートのバッキングフィールドには、イベント自体と同じ名前が付けられていますが、IMHOはC#の設計において大きなミスを犯しました。バッキングフィールドには別の名前が与えられていて、メソッド呼び出しのようにイベント名を使用しようとすると、「実行しない場合は実行しません。イベント名にnullを割り当てたり、nullと比較しようとする試みは、ベーキングフィールドで操作していたはずです。イベント名は、代わって代理人と同義であると見なされるべきではない。 – supercat

1

C#はデザインパターンを採用しており、これを第一級の市民にしました。なぜ単に提供されているものを使用しないのですか?あなたの例では、C#の組み込みのイベント構造では行えないことは何も表示されません。

+0

私はイベントを使用することに反対していませんが、私は統計更新を実装するユーザーとクラスの間に双方向の依存関係を保つ必要があります。 – CountCet

+0

依存関係はありません。 1つのクラスがイベントを公開し、別のクラスがそれを処理します。このパターンは、クラス間の結合/依存性の必要性を減らします。 –

+0

@EdS:適切なオブザーバーパターンでは、イベントパブリッシャーはサブスクライバーがガベージコレクションされるのを防ぐべきではありません(イベントサブスクライバーが存在する参照がなくても役立つ状況がありますが、サブスクライバに 'ConditionalWeakTable'を使ってその寿命を気にするものに付け加えることで)。イベントは、.netのメモリリークの主な原因です。 – supercat