.net实现松耦合事件的三种方法
时间:2011-05-05 来源:wzc998
松耦合事件实现方法有多种,本文重点描述使用spring.net来实现。并同时给出其他实现方案。
一,spring.net
Spring.Objects.Events.IEventRegistry 接口封装了事件注册中心,spring容器通过Spring.Objects.Events.Support.EventRegistry对象代理实现了这个事件注册中心。于是我们可以使用如下几个方法把事件注册到容器中。
void PublishEvents(object sourceObject); void Subscribe(object subscriber); void Subscribe(object subscriber, Type targetSourceType); void Unsubscribe(object subscriber); void Unsubscribe(object subscriber, Type targetSourceType);使用 PublishEvents方法来发布主题,使用Subscribe对主题进行订阅并设定订阅主题类型(targetSourceType参数)。发布和订阅操作完全建立在主题和观察者互不了解的前提下进行的,所以实现了松耦合的事件机制。
using (IApplicationContext ctx = ContextRegistry.GetContext())
{
Provider provider = ctx.GetObject("Provider") as Provider;
ctx.PublishEvents(provider);
Consumer consumer = ctx.GetObject("Consumer") as Consumer;
ctx.Subscribe(consumer);
Console.WriteLine("Provider name: " + provider.ProviderName);
Console.WriteLine("Consumer name: " + consumer.ConsumerName);
provider.Produce();
Console.WriteLine(consumer.ConsumerName + "'s HandledFlg is " + consumer.EventHandled.ToString());
}
观察者的订阅方式取决于使用的订阅方法:
Subscribe(object subscriber)观察者订阅事件中心所有能处理的事件。
Subscribe(object subscriber, Type targetSourceType)观察者订阅事件中心指定类型主题的所有能处理的事件。
观察者同样可以取消订阅:
void Unsubscribe(object subscriber);
void Unsubscribe(object subscriber, Type targetSourceType);观察者甚至可以这样进行订阅和取消订阅:
void Unsubscribe(object subscriber, Type targetSourceType); 取消对某类型主题的订阅,保留对其他类型主题的订阅。
二,使用企业库实现松耦合事件
1,首先抽象一个事件中心接口,包含中心可处理的事件,主题和观察者都将实现该接口。
public interface IEvSink{
void OnEvent1();
void OnEvent2();
}
2,主题,从ServicedComponent继承,并声明类特性。主题和观察者之间的交互通过标记为EventClass类由Com+服务来处理,所以实现了松耦合的事件机制。
[EventClass]public class MyPublisher : ServicedComponent, IEvSink
{
public MyPublisher()
{
//
// TODO: Add constructor logic here.
//
}
public void OnEvent1()
{ }
public void OnEvent2()
{ }
}
观察者,从ServicedComponent继承,实现事件处理
public class MySubscriber : ServicedComponent, IEvSink{
EventLog ev = new EventLog("Application");
public void OnEvent1()
{
ev.Source = "ClassLibLCE";
ev.WriteEntry("OnEvent1 Fired");
}
public void OnEvent2()
{
ev.Source = "ClassLibLCE";
ev.WriteEntry("OnEvent2 Fired");
}
}
这个例子取自 http://support.microsoft.com/kb/318185/en-us
三,http://www.codeproject.com/KB/cs/DynamicInvoking.aspx