Я думаю, вам нужно найти хорошего издателя / подписчика здесь.Я предлагаю что-то вроде этого:
ваш издатель: 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)
, создать класс Named 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
}
надеюсь, что я помог :)