文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>.net实现松耦合事件的三种方法

.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);

观察者甚至可以这样进行订阅和取消订阅:

 

Subscribe(object subscriber);观察者订阅事件中心所有能处理的事件。

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


 

 

 

 

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载