活动集

时间:2011-08-30 15:20:01

标签: c# .net events collections

我在c#中使用事件作为发布者/订阅者模式。但是我在设计时不知道我的程序将使用多少个发布者。我想直接向一个类动态添加事件,或者更合理地添加到包含事件的集合/字典中。

使用C#是否可以使用这些方案?

2 个答案:

答案 0 :(得分:1)

创建发布者发布到的订阅者以及订阅者订阅的媒介。例如:

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(不在我的示例中),以便在处置期间取消订阅Mediator。

答案 1 :(得分:0)

为了执行此操作,您需要断开事件与其来源的连接。这通常用事件聚合器完成;它管理想要发布事件的客户以及想要订阅事件的客户。所有这些都将发布者与听众分离,并允许您按照自己的描述进行处理。

Prism has an event aggregator开箱即用,可以IEventAggregator界面的形式使用。