Коллекция событий - PullRequest
       11

Коллекция событий

2 голосов
/ 30 августа 2011

Я использую события в качестве шаблона издателя / подписчика в c #. Однако во время разработки я не знаю, сколько издателей будет использовать моя программа. Я хотел бы динамически добавлять события либо в класс напрямую, либо, что более вероятно, в коллекцию / словарь, содержащий события.

Возможен ли любой из этих сценариев с использованием C #?

Ответы [ 2 ]

1 голос
/ 30 августа 2011

Создайте посредника, на который публикуют ваши издатели и на который подписываются ваши подписчики. Например:

public class Mediator
{
    public static readonly Mediator Current = new Mediator();
    public event EventHandler<EventArgs> EventRaised;
    public void RaiseEvent(object sender, EventArgs eventArgs)
    {
        if (EventRaised!=null) 
            EventRaised(sender, eventArgs);
    }
}
public class PublisherEventArgs : EventArgs
{
    public string SomeData { get; set; }
}
public class Publisher
{
    public void Publish(string data)
    {
        Mediator.Current.RaiseEvent(this, new PublisherEventArgs() { SomeData = data} );
    }
}
public class Subscriber
{
    public Subscriber()
    {
        Mediator.Current.EventRaised += HandlePublishedEvent;
    }

    private void HandlePublishedEvent(object sender, EventArgs e)
    {
        if(e is PublisherEventArgs)
        {
            string data = ((PublisherEventArgs)e).SomeData;
            // todo: do something here
        }
    }
}

Убедитесь, что вы внедрили IDisposable на своем подписчике (в моем примере это не так), чтобы он отписывался от посредника во время утилизации.

0 голосов
/ 30 августа 2011

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

Prism имеет агрегатор событий , который можно использовать в виде интерфейса IEventAggregator.

...