.net实现松耦合事件的三种方法

本文介绍使用Spring.NET和企业库实现松耦合事件机制的方法。重点讲解如何通过Spring.NET的事件注册中心进行事件发布与订阅,以及如何利用企业库中的Com+服务实现主题与观察者之间的解耦。

松耦合事件實現方法有多種,本文重點描述使用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
{
    
void OnEvent1();
    
void  OnEvent2();

2,主題,從ServicedComponent繼承,並聲明類特性。主題和觀察者之間的交互通過標記為EventClass類由Com+服務來處理,所以實現了松耦合的事件機制。

[EventClass]
public class MyPublisher : ServicedComponent, IEvSink
{
    
public MyPublisher()
    {
        
//  
        
//< /SPAN> TODO: Add constructor logic here.
        
// 
< /SPAN>    }
    
public  void  OnEvent1()
    { }
    
public< SPAN style="COLOR: #000000"> 
void OnEvent2()
    { }

觀察者,從ServicedComponent繼承,實現事件處理

public< SPAN style="COLOR: #000000"> 
class MySubscriber :  ServicedComponent, IEvSink
{
    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 ");
    }

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值