我认为你必须在这里实现一个好的发布者/订阅者。我的建议是这样的:
您的发布者:EventAggregator
应该有如下方法:
public void Register(IEventObserver observer, EventFilter filter)
public void Unregister(IEventObserver observer)
你IEventObserver
应该看起来像
public interface IEventObserver
{
void Notify(object eventSource, DetailedEventArgs e);
}
你的订阅者应该实现这个接口。
您的EventFilter
类应该具有您打算使用的所有过滤属性。这个类可以有这样的方法:
public bool IsSatisfiedBy(DetailedEventArgs e)
并创建一个名为的类DetailedEventArgs
并从中继承它EventArgs
,将您想要的有关事件的所有详细信息放在上面。
在该Register
方法中,您应该存储过滤器和观察者。现在当你EventAggregator
捕捉到一个事件时,它应该首先DetailedEventArgs
从接收到的事件中创建对象,然后循环观察者及其过滤器以查看过滤器是否被对象满足,如果满足,则使用原始发送者调用观察者的 Notify 方法和DetailedEventArgs
对象。
我强烈建议您检查发布者端而不是订阅者端的过滤器。因为签入订户端会使大量代码重复和不一致。
编辑:一个例子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
}
希望我有所帮助:)