有很多朋友要求给出一个应用ESFramework的Demo,在前面介绍ESFramework支持的4层架构中(回顾),有AS、FS、IRAS,其中FS的功能需求最简单,所以本文就给出一个FS实现示例。
    
    FS主要用于管理功能插件,并且将所有的功能性请求都转发给对应的功能插件处理,不需要关心用户(由AS管理)、不用关心具体的业务需求(由对应的功能插件处理),所以FS非常的单纯,基本上是与应用无关的,可以在任何应用中复用同一个FS。(但是AS和IRAS就很难复用了,因为不同的应用对AS、IRAS的需求的差别可能非常大)。

实际上,FS的实现自己只包含4个cs文件,绝大多数组件都由ESFramework提供了。下面是FS项目中文件的结构图:

    其中,MainForm是主界面,FsConfiguration是FS的配置,下面马上会讲到的是FunctionServer这个FS中的核心类。

我们已经知道,FS通过Tcp发布服务给AS使用,即AS通过与FS之间的Tcp连接池来使用FS提供的服务,所以会使用到ESFramework提供的ITcp组件。
    其次,FS需要管理所有的功能插件,所以它需要使用ESFramework提供的IAddinManagement组件。
    在理解了这两点的基础上,我们可以定义FunctionServer这个类了,它很简单,所有方法及实现如下所示:

        public void LoadAddins()
        {
            string directory = System.IO.Directory.GetParent(System.Windows.Forms.Application.ExecutablePath).FullName ;
            this.addinManagement.LoadAllAddins(directory ,true) ;
        }

public void Start()
        {
            this.agileTcp.Start() ;
            this.serverPerformanceMonitor.Start() ;
            this.asRemotingServiceAccesser.FsStarted() ;
        }

public void Stop()
        {
            this.agileTcp.Stop() ;
            this.serverPerformanceMonitor.Stop() ;
            this.asRemotingServiceAccesser.FsToExit() ;
        }

public void ReadyToExit()
        {
            this.Stop() ;        
            this.agileTcp.Dispose() ;                
        }

各个方法的含义和成员变量的含义相信大家已经非常的明白了,由必要解释一下serverPerformanceMonitor,它用于监控本服务器的性能状态,并将性能数据通过事件发布。如果你读过前面的文章,你会知道,这些性能数据将被发送给AS,然后AS根据这些性能数据在多个FS上进行负载均衡调度。asRemotingServiceAccesser用于访问AS发布的远程服务,比如FS启动或退出时通知AS。

FS核心的类FunctionServer就这些功能。你一定非常想知道,ITcp、ITcpStreamDispatcher等是如何与FunctionServer装配起来的,谜底马上揭晓。相对于使用4个cs文件就实现了FS来说,FS的组件装配就稍微复杂些(AS则更复杂)。我采用SPring.NET来完成组件装配。
    我们先看ITcp组件的装配:

        <object name="agileTcp" type="ESFramework.Network.Tcp.AgileTcp ,ESFramework" init-method="Initialize">
                <property name="Port">
                    <object type="Spring.Objects.Factory.Config.PropertyRetrievingFactoryObject ,Spring.Core">
                        <property name="TargetObject" ref="fsConfiguration"/>
                        <property name="TargetProperty" value="TcpPort"/>
                    </object>
                </property>    
                <property name="MaxMessageSize" value="2000000"/>
                <property name="Dispatcher" ref="tcpStreamDispatcher"/>
                <property name="ContractHelper" ref="contractHelper"/>
                <property name="BufferPool">
                    <object type="ESFramework.Network.Tcp.SimpleBufferPool ,ESFramework"/>
                </property>
           </object>    

如果你研究过AgileTcp组件,上面的配置非常容易理解,最主要的,AgileTcp使用的分派器组件,分配器组件的装配如下:

        <object name="tcpStreamDispatcher" type="ESFramework.Network.Tcp.TcpStreamDispatcher ,ESFramework">                
                <property name="ContractHelper" ref="contractHelper"/>
                <property name="TcpClientsController" ref="agileTcp"/>            
                <property name="RequestDealerFactory">
                    <object type="ESFramework.Network.FunAddinDealerFactory ,ESFramework">
                        <property name="AddinManagement" ref="addinManagement"/>
                    </object>
                </property>    
           </object>

非常需要说明一点的是,消息分派器使用的处理器工厂是ESFramework.Network.FunAddinDealerFactory,因为它只需要处理功能请求,并且这些功能请求是由功能插件处理的,所以使用ESFramework.Network.FunAddinDealerFactory就可以了,而不需要使用功能全面的EsbRequestDealerFactory,EsbRequestDealerFactory通常由AS使用。

最后一个重要组件的装配--FunctionServer:

            <object name="functionServer" type="FunctionServerSystem.Server.FunctionServer ,FunctionServerSystem">
                <property name="AgileTcp" ref="agileTcp"/>        
                <property name="AddinManagement" ref="addinManagement"/>
                <property name="ServerPerformanceMonitor" ref="serverPerformanceMonitor"/>
                <property name="AsRemotingServiceAccesser" ref="asRemotingServiceAccesser"/>
            </object>

毫无秘密可言!

还有就是主界面MainForm的装配,就不罗列了,大家看源码就知道了。这是FS的一个例子,如果你需要看到客户端的例子,AgileIM的源码是一个选择,不过AgileIM稍微复杂了些,过段时间我会给出一个简单的建立在ESFramework上的客户端实现。
    下面是FS运行时的截图:

下载FS源码 (VS2003)。

【转载】可复用的FS相关推荐

  1. ESFramework 可复用的通信框架(序)

    自从2004年7月开始,就一直从事N层C/S结构的服务端的开发,从最初的熟悉各种Windows Socket API.熟悉完成端口模型,探索高效稳定的服务端通信模型,时至今日,慢慢的积累了一些C/S服 ...

  2. 【转载】【FS】FATFS文件系统介绍(未完待续........2018.4.1)

    一.这是个什么玩意 它是一个文件系统,那文件系统是个什么玩意,直接从字面意思理解,它就是个管理文件的系统,所以叫文件系统,直白吧,也可以说是文件存储协议.但是继续追问的话会问,怎么来管理文件呢?好,基 ...

  3. 转载:介绍AD另外一种奇葩的多通道复用的方法

    原文链接:http://www.eda365.com/forum.php?_dsign=74fe4957&mod=viewthread&page=1&tid=110710 在设 ...

  4. (转载)有关推挽输出、开漏输出、复用开漏输出、复用推挽输出以及上拉输入、下拉输入、浮空输入、模拟输入区别...

    以及上拉输入.下拉输入.浮空输入.模拟输入的区别 最近在看数据手册的时候,发现在Cortex-M3里,对于GPIO的配置种类有8种之多: (1)GPIO_Mode_AIN 模拟输入 (2)GPIO_M ...

  5. Connect模块解析 转载

    来自对<了不起的Node.js>一书的学习 Connect Node.js为常规的网络应用提供了基本的API.然而,实际情况下,绝大部分网络应用都需要完成一系列类似的操作,这些类似的操作你 ...

  6. 复用io selectors模块

    IO复用:为了解释这个名词,首先来理解下复用这个概念,复用也就是共用的意思,这样理解还是有些抽象,为此,咱们来理解下复用在通信领域的使用,在通信领域中为了充分利用网络连接的物理介质,往往在同一条网络链 ...

  7. Linux IO复用区别与epoll详解

    转载:http://blog.csdn.net/hacker00011000/article/details/52160590 一.select.poll.epoll之间的区别总结[整理]  sele ...

  8. [转载] Java面试题全集(上)

    参考链接: 如何运行不同目录中的Java类文件 2013年年底的时候,我看到了网上流传的一个叫做<Java面试题大全>的东西,认真的阅读了以后发现里面的很多题目是重复且没有价值的题目,还有 ...

  9. 转载来自朱小厮的博客的NIO相关基础篇

    用户空间以及内核空间概念 我们知道现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操心系统的核心是内核,独立于普通的应用程序,可以访问受保 ...

最新文章

  1. AC日记——[HNOI2010]BOUNCE 弹飞绵羊 洛谷 P3203
  2. R语言使用randomForest包构建随机森林模型的步骤和流程、随机森林算法包括抽样样本(观察)和变量来创建大量的决策树(多个树,构成了森林,而且通过样本抽样和变量抽样,让多个树尽量不同)
  3. 下拉列表框Spinner
  4. Python Django 一对多逆向查询示例
  5. 将四个整数进行从小到大的顺序排列 java_07_Java基础语法_第7天(练习)_讲义(练习加强+在eclipse中实现)...
  6. 学计算机所需要的英语单词,学计算机最少要懂的英语单词是什么
  7. ffplay 分析(音频从Frame(解码后)队列取数据到SDL输出)
  8. (88)Verilog HDL系统函数和任务:$fdisplay
  9. 利用Pelican搭建个人博客
  10. wxPython多个窗口的基本结构
  11. 【易实战】SpringCloud Greenwich架构概览深度详解
  12. hist 和imhist的区别
  13. gradle下载慢的解决方案
  14. python matplotlib 矢量图svg emf
  15. 3dmax渲染很慢/很卡?
  16. codeforces1467E Distinctive Roots in a Tree
  17. “别人家”的毕设:造了个车!拆装驾驶一步到位,宅家5个月,设计建模组装自行完成
  18. supervisor控制台运行出错,BACKOFF Exited too quickly
  19. ValueError.DataFrame columns must be unique for orient=“column“
  20. P3975 [TJOI2015]弦论

热门文章

  1. 从新手机到老股票 闲鱼为何会沦为骗子与营销的新平台?
  2. query string parameters什么意思_public static void main(String[] args) 是什么意思?(转)...
  3. html select选择事件_一道搜狗面试题:IO多路复用中select、poll、epoll之间的区别...
  4. SQLServer2008-镜像数据库实施手册(双机)SQL-Server2014同样适用
  5. 利用WebBrowser实现Web打印的分析
  6. Unity3D4.* NGUI制作动态字库
  7. java--用 * 打印出各种图形(新手请进)
  8. ajax跨域请求的问题
  9. iOS6.0以上版本,关于NSDateFormatter的问题
  10. 将字符串中的大写字母变成小写字母