松耦合事件實現方法有多種,本文重點描述使用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 + < SPAN style="COLOR: #800000">"'s HandledFlg is "< /SPAN> + consumer .EventHandled.ToString());
; }
觀察者的訂閱方式取決於使用的訂閱方法:</P>
Subscribe(object subscriber)觀察者訂閱事件中心所有能處理的事件。
Subscribe(object subscriber, Type targetSourceType)觀察者訂閱事件中心指定類型主題的所有能處理的事件。
觀察者同樣可以取消訂閱:
void Unsubscribe(object subscriber);
void Unsubscribe(object subscriber, Type targetSourceType);
觀察者甚至可以這樣進行訂閱和取消訂閱:
Subscribe(object subscriber);觀察者訂閱事件中心所有能處理的事件。
void Unsubscribe(object subscriber, Type targetSourceType); 取消對某類型主題的訂閱,保留對其他類型主題的訂閱。
二,使用企業庫實現松耦合事件
1,首先抽像一個事件中心接口,包含中心可處理的事件,主題和觀察者都將實現該接口。
public interface< /SPAN> IEvSink } 2,主題,從ServicedComponent繼承,並聲明類特性。主題和觀察者之間的交互通過標記為EventClass類由Com+服務來處理,所以實現了松耦合的事件機制。 } 觀察者,從ServicedComponent繼承,實現事件處理
{
void OnEvent1();
void OnEvent2();
public class MyPublisher : ServicedComponent, IEvSink
{
public MyPublisher()
{
//
//< /SPAN> TODO: Add constructor logic here.
//
< /SPAN> }
public void OnEvent1()
{ }
public< SPAN style="COLOR: #000000"> void OnEvent2()
{ }
{
EventLog ev = new EventLog("Application");
public void OnEvent1()
;{
ev.Source = "ClassLibLCE";
ev.WriteEntry(< SPAN style="COLOR: #800000">"OnEvent1 Fired"< SPAN style="COLOR: #000000">);
}
public void OnEvent2()
{
ev.Source = "ClassLibLCE";
ev.WriteEntry("OnEvent2 Fired ");
}
}