我在c#中使用事件作为发布者/订阅者模式。但是我在设计时不知道我的程序将使用多少个发布者。我想直接向一个类动态添加事件,或者更合理地添加到包含事件的集合/字典中。
使用C#是否可以使用这些方案?
答案 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
界面的形式使用。