2011-12-05 18 views
0

私のアプリケーションのイベントアグリゲータを設計しようとしています。 (私はデザインパターンが慣れていないので、まだ完全に理解していないかもしれません)。イベントアグリゲータ:解決策の変更が必要です

まず、私はいくつかのアグリゲータであるソリューションを作成しましたが、効率の向上と依存性の軽減のためには、改善とリファクタリングが必要です。

1)イベントアグリゲータのデザインパターンでは、.NETデータソースはパブリッシャと見なされますか? (私は出版社の役割については不明です)。

2)特定のデータソースだけでなく特定のデータイベントに対してもサブスクリプションを処理するソリューションを設計するにはどうすればよいですか?私は、リストを保持して、飽き飽きしてループする解決策を見たいと思っています。しかし、これをすべて一緒に避けることができるかどうかはわかりません。

答えて

1

ここでいい出版社/購読者を実装する必要があると思います。

あなたの出版社:あなたのIEventObserverは、あなたの加入者は、このインタフェースを実装する必要があり

public interface IEventObserver 
{ 
    void Notify(object eventSource, DetailedEventArgs e); 
} 

のようになります

public void Register(IEventObserver observer, EventFilter filter) 
public void Unregister(IEventObserver observer) 

EventAggregatorのようなメソッドを持っていなければならない私の提案は、このようなものです。

EventFilterクラスには、使用するすべてのフィルタリングプロパティが必要です。 このクラスでは、このような方法で持つことができます。

public bool IsSatisfiedBy(DetailedEventArgs e) 

をしてDetailedEventArgsという名前のクラスを作成し、EventArgsからそれを継承し、その上のイベントについて、必要なすべての詳細を置きます。

Registerの方法では、フィルタとオブザーバの両方を保存する必要があります。今度はEventAggregatorがイベントをキャッチするときは、受け取ったイベントから最初にDetailedEventArgsオブジェクトを作成し、オブザーバとそのフィルタをループしてフィルタがオブジェクトで満たされているかどうかを確認し、そうであればオブザーバのNotifyメソッドを元の送信者とDetailedEventArgsオブジェクトです。

サブスクライバ側ではなく、パブリッシャ側でフィルタを確認することを強くお勧めします。加入者側でチェックすると、コードが重複して矛盾することになります。

EDIT:例EventFilterDetailedEventArgsクラス:

public class EventFilter 
{ 
    private List<Type> SourceTypes; 
    private List<EventType> EventTypes; 
    public EventFilter() : this(new Type[] { }, new EventType[] { }) { } 
    public EventFilter(IEnumerable<Type> sourceTypes, IEnumerable<EventType> eventTypes) 
    { 
     SourceTypes = new List<Type>(sourceTypes); 
     EventTypes = new List<EventType>(eventTypes); 
    } 
    public void AddSourceType(Type type) 
    { 
     AddItemToList(SourceTypes, type); 
    } 
    public void AddEventType(EventType type) 
    { 
     AddItemToList(EventTypes, type); 
    } 
    private void AddItemToList<T>(List<T> list, T item) 
    { 
     lock (list) 
     { 
      if (!list.Contains(item)) 
       list.Add(item); 
     } 
    } 
    public bool IsSatisfiedBy(DetailedEventArgs args) 
    { 
     return SourceTypes.Contains(args.Source.GetType()) && EventTypes.Contains(args.EventType); 
    } 
} 
public class DetailedEventArgs : EventArgs 
{ 
    public EventArgs SourceArgs { get; private set; } 
    public object Source { get; private set; } 
    public EventType EventType { get; private set; } 
    public DetailedEventArgs(object source, EventArgs sourceArgs, EventType eventType) 
    { 
     Source = source; 
     SourceArgs = sourceArgs; 
     EventType = eventType; 
    } 
} 
public enum EventType 
{ 
    EventType1, 
    EventType2, 
    EventType3 
} 

希望私はこのアドレス#2 :)

+0

このEventFilterをどのように構造化するべきか(そして何の情報が格納されるべきか)は完全にはわかりません。見た目の例を提供することができますか? – developer

+0

答えを編集して例を追加しました。私の例では、 'EventFilter'クラスはソースの' Type'で動作しますが、必要に応じてそれらをオブジェクトに変更してソースインスタンスをチェックすることができます。 –

0

MVVM Light Messengerクラスを確認してください。私はその実装に基づいています。しかし、それはリストとループを使用しますが、私はそれを回避する方法は見当たりません。

私はメモリリークについていくつかの苦情を見たことがありますが、それは私に影響を与えておらず、修正される可能性があります。

+0

うを助けましたか? (他の人の意見を聞きながら、データソースからのいくつかのイベントを無視しているユーザ) – developer

+0

はい。登録メソッドの汎用タイプはです。そのタイプのメッセージだけがその受信者に送信されます。 – cadrell0

+0

ありがとう、私はこれが私を助けることができるかどうかを調べます。私はしばらくの間、答えを選択しません。私がこれが助けるかもしれないことを確かに知るまで。 (そして他の人が回答を投稿するかどうかを調べる)。本当にありがとう! :D – developer

関連する問題