Sloth 实战2 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

---Sloth与SlothAgent

Sloth中使用远程服务对象

有时我们需要利用Sloth向远程代理服务器自定义传送对象,方便操作。那么在Sloth中解耦的情况下怎么实现呢?其实很简单,就像操作普通对象一样。

1.为了让对象穿越应用域边界,在Sloth和Agent中互相传递的对象,必须派生于MarshalByRefObject这个类;

2.如果想长时间使用传递的对象,必须将对象重载InitializeLifetimeService这个方法,设置生命周期为无限制;例如:

 public override object InitializeLifetimeService()

        {

            return null;

        }

3.客户端使用对象时,首先需要通过Sloth向SlothAgent申请远程对象,此时远程对象需要在服务端创建后,传递到客户端;

4.和其他一样,需要在Sloth和Agent间传递的对象,需要在客户端和服务端同时存在;

5.由于dotNet FrameWork1.1起默认远程对象不允许被反序列化,所以需要将SlothAgent的安全模式设置为完全信任模式;例如:

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

利用远程事件,绕开Sloth,直接操作远程服务对象

或许您会很不习惯在开发中反复使用Sloth提供的远程调用方法和Agent通讯。那么您可以通过远程事件,绕开Sloth直接操作远程对象。

远程服务事件只需要在开发时,根据自己的需求在服务组件上编制。Sloth没有特定的规则约束,只要遵循.Net开发框架下的定义就可以了。客户端调用远程方法,类似与客户端向服务组件发传真,就能激活远程对象的事件处理。这样,能轻松绕开Sloth提供的方法。

远程通用对象:

public class EventWrapper : MarshalByRefObject

    {

        public delegate void CustomEventHandler(string messages);

        public event CustomEventHandler LocalBroadCastEvent;

        private int index;

 

        public int Index

        {

            get { return index; }

            set { index = value; }

        }

 

        

        public EventWrapper()

        {

            

        }

 

        public void AnswerEvent(string message)

        {

 

            this.index += 1;

                LocalBroadCastEvent(message);

 

        }

        

        public override object InitializeLifetimeService()

        {

            return null;

        }

    }

远程通用对象继承于MarshalByRefObject,这样可以在不同应用域中相互传递。如果不需要客户端对远程对象的生命周期进行管理,可以将生命周期设置为无限制。

服务对象组件:

public class TailorService

    {

        public event Demo.EventBase.EventWrapper.CustomEventHandler CustomEvent;

        private EventWrapper targetEvents = null;

        

        /**//// <summary>

        /// 获取远程对象

        /// </summary>

        /// <returns></returns>

        public Hashtable GetRemoteObj()

        {

            Hashtable result = new Hashtable();

            try

            {

                targetEvents = new EventWrapper();

                EventWrapper targetevents = new EventWrapper();

                //targetevents.LocalBroadCastEvent += new EventWrapper.CustomEventHandler(targetEvents.AddText); //创建远程对象同时,定制服务组件的接收事件;

                EventWrapper.CustomEventHandler CustomEventType = new EventWrapper.CustomEventHandler(targetEvents.AnswerEvent);

                

                result.Add("EventWrapper", targetevents);

                result.Add("CustomEventHandler", CustomEventType);

            }

            catch(Exception ex)

            {

                throw (ex);

            }

            return result;

        }

        /**//// <summary>

        /// 服务端相应的事件

        /// </summary>

        /// <param name="message"></param>

        private void AddText(string message)

        {

            MessageBox.Show("number" + targetEvents.Index.ToString() + " Client Fax: " + message);

        }

        /**//// <summary>

        /// 定制事件

        /// </summary>

        public EventWrapper SimulateEvent()

        {

            try

            {

                if (targetEvents != null)

                {

                    targetEvents.LocalBroadCastEvent += new EventWrapper.CustomEventHandler(this.AddText);

                 

                }

            }

            catch (Exception ex)

            {

                throw (ex);

            }

            return targetEvents;

        }

        

    }

服务对象提供创建远程对象的实例,订阅远程事件等方法提供给客户端使用。客户端首先会从服务对象获取远程对象实例;

首先,在远程对象中定义代理事件的格式:

public delegate void CustomEventHandler(string messages);

并且使用代理的对外接口:

public event CustomEventHandler LocalBroadCastEvent;

然后由服务对象绑定远程对象需要使用的事件:

if (targetEvents != null)

{

targetEvents.LocalBroadCastEvent += new EventWrapper.CustomEventHandler(this.AddText);

}

客户端需要显示的获取远程对象:

//再次获取远程服务对象;(可以在创建远程对象时,在服务上创建事件代理)

eventWrapper = ic.RemoteService<EventWrapper>("TailorService", "SimulateEvent", null);

获取远程对象后,客户端就可以直接使用远程对象的事件了;

SlothAgent的状态选择

SlothAgent提供了2种服务器的运行模式:有状态和无状态。那么,这两种模式有什么不同呢?

1.      有状态模式: Agent会在运行期间为每个连接的客户端保存所使用的服务对象的实例,每个实例间互不干扰;

2.      无状态模式:Agent在运行期间不会为每个用户保存所使用的服务对象实例的状态,只是将所有的对象实例保存,方便快速使用;

Sloth的预计增加的功能

Business Rule Engine 业务规则引擎

规则语言分为两类:

“面向程序技术”的规则语言,使用者是开发人员。在开发期由开发人员创建最初的控制规则集,能按需求满足系统的运行;

“面向业务”的规则语言,使用者是最终用户。引擎会根据由开发人员定制的规则集,产生用于业务的规则集,由用户修改或拓展规则集,减少由于业务变化产生的维护麻烦等问题;

示例代码下载:http://files.cnblogs.com/duochunyu/EventDemoSource_061121.rar

转载于:https://www.cnblogs.com/duochunyu/archive/2006/11/22/568829.html

Sloth 实战(二)之远程对象相关推荐

  1. Taro多端开发实现原理与项目实战(二)

    Taro多端开发实现原理与项目实战(二) 多端电商平台项目概述及开发准备 学习了前面的基础知识和进阶后是否跃跃欲试?我们准备了一个电商平台的项目来和大家一起实践使用 Taro 开发电商平台. 项目概述 ...

  2. 【Qt】数据库实战(二)

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 连接到数据库 04. 操作结果集 06. 附录 01. 概述 SQL即结构化查询语言,是关系数据库的标准语言.前面已经在Q ...

  3. 小米手环iOS开发实战(二):开发Demo让你的手环振动起来

    小米手环iOS开发实战(二):开发Demo让你的手环振动起来 上一节讲了CoreBluetooth的使用,理论知识很枯燥,那么现在先利用上一节讲的内容,做一个简易手环应用,实现连接/断开手环,查看手环 ...

  4. python用户界面游戏_用Python和Pygame写游戏-从入门到精通(实战二:恶搞俄罗斯方块2)...

    我们接着来做这个整死人不偿命的俄罗斯方块. 代码组织和名词约定 上一次我们稍微整理了一下游戏运行的框架,这里需要整理一下python代码的框架,一个典型的pygame脚本结构如下: 其中,lib为py ...

  5. java爬取网页数据_Python网络爬虫实战(二)数据解析

    Python网络爬虫实战 (二)数据解析 本系列从零开始阐述如何编写Python网络爬虫,以及网络爬虫中容易遇到的问题,比如具有反爬,加密的网站,还有爬虫拿不到数据,以及登录验证等问题,会伴随大量网站 ...

  6. mysql5.7开机wmi_跟我从头学WMI(二)--访问WMI对象

    WMI对象 一.   使用脚本连接到WMI 1. 使用SWBEM脚本API SWBEM脚本是可以用来访问和控制WMI内部对象的一系列可用在脚本中的对象. Scripting object model ...

  7. DDD实战与进阶 - 值对象

    目录 DDD实战与进阶 - 值对象 概述 何为值对象 怎么运用值对象 来看一个例子 值对象的持久化 总结 DDD实战与进阶 - 值对象 系统小说网 wap.kuwx.net 概述 作为领域驱动设计战术 ...

  8. Bootstrap基础二十七 多媒体对象(Media Object)

    Bootstrap<基础二十七> 多媒体对象(Media Object) 原文:Bootstrap<基础二十七> 多媒体对象(Media Object) Bootstrap 中 ...

  9. 【干货】原生js做的一维数组对象,二维数组对象的模糊查询(前端网备份)...

    最重要的是二维数组 小程序通讯录(student) 后台的数据格式 wxml <input bindconfirm="search" bindinput="bind ...

  10. 实战:在远程网络配置DNS转发

    2.1 实战:在远程网络配置DNS转发 实战目标: ü 在公司的远程网络中添加DNS服务器并配置为DNS转发器,以节省远程网络到总公司网络之间的域名解析流量. 企业场景: 微软河北技术支持中心,有两个 ...

最新文章

  1. JavaScript学习笔记 - 入门篇(1)- 准备
  2. 3.NIO_Buffer缓冲区
  3. phpshe b2c商城系统配置nginx支持pathinfo和rewrite的写法
  4. tornado学习笔记day06-应用安全
  5. mysql8.0导入备份_mysql8.0.20配合binlog2sql的配置和简单备份恢复的步骤详解
  6. 【转载】DNN6开源CMS
  7. 设计sample语言的语法_Verilog语法之〇:Verilog HDL简介
  8. JavaScript jQuery bootstrap css ajax
  9. APT***实例研究与企业现有防御体系缺陷分析
  10. greenDAO系列7--关系
  11. Java——SOF 与 OOM
  12. PM、GAN、InfoGAN、对抗自编码模型对比
  13. 定制MACD背离副图
  14. happen-before原则与JMM内存模型
  15. 搜索引擎模块设计与实现——相关度搜索算法模块
  16. python PIL库中的getpixel函数
  17. Java必背基础词汇
  18. 读《Google软件测试之道》笔记---SWE,SET,TE职责
  19. A卡 HD5770(HD6770) Readon HD 5xxx 6xxx系列显卡黑苹果MOJAVE CATALINA QE/CI驱动教程
  20. winrar5.9-64位最新版

热门文章

  1. 物联网传感技术——压电式传感器
  2. 阳明心学在敏捷开发中的应用
  3. GW INSTEK GPD 3303系列稳压源控制软件(自行使用c#编写)更新
  4. CDN选择合适的回源策略很重要
  5. 对于上海交通大学网络安全专业21考研823的一些总结以及22考研专业课如何准备的想法
  6. 网络攻防之wireshark抓取登录信息
  7. 清理android根目录垃圾,安卓清理君——清除手机垃圾
  8. phoenix查不到数据_Phoenix查询测试经验总结
  9. 小心!QQ和MSN聊天记录也会随时被监控
  10. C语言根号下ln怎么表示,用C语言怎么编y=sin(根号下ax)+ln(a+X)