Event Aggregator: нужна помощь в изменении решения - PullRequest
0 голосов
/ 05 декабря 2011

Я пытаюсь создать агрегатор событий для моего приложения. (Я новичок в шаблоне проектирования, поэтому, возможно, еще не до конца его понимаю).

Во-первых, я уже создал решение, которое несколько агрегирует, но нуждается в улучшении и рефакторинге для достижения большей эффективности и уменьшения зависимостей.

1) Будут ли мои источники данных .NET считаться издателями в шаблоне разработки Event Aggregator? (Я не уверен насчет роли издателей).

2) Как бы я разработал свое решение для обработки подписок не только на конкретные источники данных, но и на конкретные события данных, игнорируя при этом другие? Я хотел бы увидеть решение, которое отошло бы от ведения списков и неуклонного их просмотра ... но не уверен, смогу ли я избежать всего этого вместе.

Ответы [ 2 ]

1 голос
/ 07 декабря 2011

Я думаю, вам нужно найти хорошего издателя / подписчика здесь.Я предлагаю что-то вроде этого:

ваш издатель: 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
}

надеюсь, что я помог :)

0 голосов
/ 06 декабря 2011

Ознакомьтесь с классом MVVM Light Messenger . Я основал свою реализацию на этом. Тем не менее, он использует списки и циклы, но я не вижу способа обойти это.

Я видел некоторые жалобы на утечку памяти, но это не повлияло на меня и может быть исправлено.

...