ここでいい出版社/購読者を実装する必要があると思います。
あなたの出版社:あなたの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:例EventFilter
とDetailedEventArgs
クラス:
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 :)
このEventFilterをどのように構造化するべきか(そして何の情報が格納されるべきか)は完全にはわかりません。見た目の例を提供することができますか? – developer
答えを編集して例を追加しました。私の例では、 'EventFilter'クラスはソースの' Type'で動作しますが、必要に応じてそれらをオブジェクトに変更してソースインスタンスをチェックすることができます。 –