ESFramework介绍之(29)―― 插件公共设施 AddinUtil

简介: (本文适用于 ESFramework V0.2+)    不知你是否还记得,前面我们讲过,ESFramework规定了插件有如下特点: (1)一个插件是一个独立的物理单元。它可以独立的提供一项完整的服务(功能),而不需要依赖于其它插件。

    (本文适用于 ESFramework V0.2+)
    不知你是否还记得,前面我们讲过,ESFramework规定了插件有如下特点:
(1)一个插件是一个独立的物理单元。它可以独立的提供一项完整的服务(功能),而不需要依赖于其它插件。
(2)插件能自我描述 ―― 插件的所有对外的发布信息都由插件自己内部提供,而不依赖于外部文件或注册表。
(3)插件能自我管理 ―― 插件如果需要配置信息,则插件自己能读取和修改配置信息,而不是框架来完成这些事情。
(4)插件自我独立   ―― 一个插件不得引用其它的插件。如果一个插件与另一个插件关系紧密,那么应该将这两个插件合成一个插件,或者重新分解为两个独立的插件。

    其实上述特点都为了一个目标,那就是插件的自治及与宿主应用的松耦合。我们希望,插件与宿主应用之间不要有信息共享,或者使这种共享尽可能的少。ESFramework中对插件的支持也很好的遵循了上述特点。但是,有时候应用程序迫不得已需要将某些引用(数据)传递到有需要的插件中,因为插件自己无法直接获取这些引用,而且这些引用可能会被多个组件/插件使用到。插件公共设施AddinUtil(位于ESFramework.Addins命名空间 )提供了一个场所或这说一个容器,宿主应用程序把需要共享给插件的数据放在这个容器中,而需要使用这些数据的插件从AddinUtil获取需要的数据。无疑,AddinUtil最好实现为一个静态类。

     public   static   class  AddinUtil
    {
        
private   static  Hashtable htUtil  =  Hashtable.Synchronized( new  Hashtable()) ;

        
public   static   void  RegisterObject( string  name , object  obj)
        {
            AddinUtil.htUtil.Add(name ,obj) ;
        }

        
public   static   object  GetObject( string  name)
        {
            
return  AddinUtil.htUtil[name] ;
        }

        
public   static   void  Remove( string  name)
        {
            AddinUtil.htUtil.Remove(name) ;
        }

        
public   static   void  Clear()
        {
            AddinUtil.htUtil.Clear() ;
        }
    }

    AddinUtil的实现非常简单,就不多讲了。下面举个例子。比如,功能服务器加载的多个功能插件需要解析各自收到的请求消息,消息解析需要IContractHelper组件的协助,IContractHelper的实现通常位于宿主应用(这里是FS)中,在每个插件中都实例化一个IContractHelper组件不仅性能上不划算,而且还可能会导致多个IContractHelper组件实例状态不一致的问题。甚至,更通常的情况,在插件实现中根本不应该看到IContractHelper的实现类,因为IContractHelper的实现类通常位于FS中(或FS引用的dll中),在插件中只能看到IContractHelper接口。
    FS在启动的时候,可以将IContractHelper引用注册到AddinUtil:

AddinUtil.RegisterObject( " ContractHelper "  ,MainClass.SpringContext.GetObject( " contractHelper " )) ;

    插件在加载回调IAddin.OnLoading方法中即可从AddinUtil中获取IContractHelper引用:

IContractHelper contractHelper = (IContractHelper)AddinUtil.GetObject( " ContractHelper " ) ;

     AddinUtil就像一个中介者,宿主应用不会与任何一个插件紧密耦合,如果宿主应用需要与插件交换数据,通过AddinUtil是一种可行的方式。但是请记住,最好的方案是,宿主应用与插件之间不共享任何数据!只有在不得已的情况下才考虑使用AddinUtil!

上一篇: ESFramework介绍之(28)―― Udp组件

转到  :ESFramework 可复用的通信框架(序) 

目录
相关文章
ESFramework 4.0 有哪些优点?
作为.NET平台上的通信框架,ESFramework有哪些优点了?我们有什么理由要使用ESFramework来开发自己的通信应用?   1.高性能      ESFramework底层使用IOCP模型,使得数据收发与处理达到最高性能。
1235 0
|
安全 网络协议 Windows
在Silverlight中使用ESFramework-- ESFramework 4.0 快速上手(05)
  Silverlight已经到4.0版本了,已经相当成熟了,在Silverlight中使用socket与服务器进行通信也是常见的需求,所以,作为.NET平台的通信框架,ESFramework支持Silverlight开发是必须的。
945 0
|
网络协议
ESFramework介绍之(35)―― IMessageTransceiver
(本文适用于ESFramework V0.3+)        在ESFramework介绍之(7)-- 服务器代理IServerAgent 一文中,我们详细的介绍了IServerAgent,我们已经知道,客户端与服务器之间的所有通信都可经过IServerAgent,包括要转发的P2P消息。
907 0
|
网络协议 Java 算法
ESFramework介绍之(23)―― AgileTcp
前面已经介绍了ITcp接口,而AgileTcp就是ESFramework给出的ITcp的参考实现。在之前,我曾经讲解过模拟完成端口的Tcp组件实现和异步Tcp组件实现,在它们的基础之上,我更改了处理策略,而形成了AgileTcp,目的是更清晰的结构、更高的效率。
811 0
|
存储 数据库
ESFramework介绍之(20)―― 插件自动升级
当我们的服务平台搭建成功后,所需要做的主要事情就是开发服务端功能插件(IFunAddin)和客户端插件(IPassiveAddin),每个插件对(AddinPair)实现了一组相似或相近的需求/功能。
882 0
|
网络协议 C#
基于ESFramework的P2P实现 —— ESFramework扩展之EsfP2P
好久没有写关于ESFramework的文章了,曾很早就承诺过要写一篇介绍基于ESFramework实现NAPT P2P的文章,今天终于能抽出时间做这件事。    网络地址转换NAT(或者NAPT)的基本理论知识,网上有很多相关资料,不是很清楚的朋友可以先了解下什么是NAT、以及为什么要使用NAT。
917 0
|
网络协议
ESFramework介绍之(15)-- IRAS
每个城市都对应着自己的AS,每个AS都有一组FS为之服务,而所有的AS都由一个IRAS联系/管理起来(回顾)。前面我们已经提到,所有的FS都可以是动态添加/移除的,并且FS的地址也是自由可变的。
861 0
|
网络协议 Java
ESFramework介绍之(28)―― Udp组件
ESFramework对Tcp和Udp协议都提供了完整的支持,在ESFramework介绍之(21)-- Tcp组件接口ITcp介绍 和 ESFramework介绍之(23)―― AgileTcp 两篇文章中介绍了Tcp组件,相对于Tcp来说,Udp要简单许多,所以我在这里打算用一篇文章来介绍它。
944 0
|
存储
ESFramework介绍之(27)-- 支持OverdueMessage
(本文适用于ESFramework V0.2+)     QQ上,你给好友发消息,如果对方不在线,则服务器会把这个消息持久化存起来,等好友下次上线时,再转发给他。像这样的消息在ESFramework中称为OverdueMessage。
734 0
|
API 数据库 网络协议
ESFramework介绍之(24)―― 日志记录IEsbLogger
框架,从另外一个角度说,就是一个半成品的应用程序,既然如此,框架在运行的过程中也会遇到诸多的异常、错误情况,我们需要将这些情况记录下来,以便在发生问题时为我们的诊断提供必要的帮助。    最最开始,那还是在ESFramework的前身即EnterpriseServerBase的时候,由于当时只是将EnterpriseServerBase作为一个类库,而并没有提升到一个框架的高度,所以是没有必要为之配备一个日志记录器(Logger),就像你从来不曾看到在使用.NET类库时还必须传个日志记录器给它,以使.NET类库中的API碰到额外情况时能够记录下错误信息。
930 0