Sloth 实战2
---Sloth与SlothAgent
Sloth中使用远程服务对象
有时我们需要利用Sloth向远程代理服务器自定义传送对象,方便操作。那么在Sloth中解耦的情况下怎么实现呢?其实很简单,就像操作普通对象一样。
1.为了让对象穿越应用域边界,在Sloth和Agent中互相传递的对象,必须派生于MarshalByRefObject这个类;
2.如果想长时间使用传递的对象,必须将对象重载InitializeLifetimeService这个方法,设置生命周期为无限制;例如:
{
return null;
}
3.客户端使用对象时,首先需要通过Sloth向SlothAgent申请远程对象,此时远程对象需要在服务端创建后,传递到客户端;
4.和其他一样,需要在Sloth和Agent间传递的对象,需要在客户端和服务端同时存在;
5.由于dotNet FrameWork1.1起默认远程对象不允许被反序列化,所以需要将SlothAgent的安全模式设置为完全信任模式;例如:
利用远程事件,绕开Sloth,直接操作远程服务对象
或许您会很不习惯在开发中反复使用Sloth提供的远程调用方法和Agent通讯。那么您可以通过远程事件,绕开Sloth直接操作远程对象。
远程服务事件只需要在开发时,根据自己的需求在服务组件上编制。Sloth没有特定的规则约束,只要遵循.Net开发框架下的定义就可以了。客户端调用远程方法,类似与客户端向服务组件发传真,就能激活远程对象的事件处理。这样,能轻松绕开Sloth提供的方法。
远程通用对象:
{
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 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 业务规则引擎
规则语言分为两类:
“面向程序技术”的规则语言,使用者是开发人员。在开发期由开发人员创建最初的控制规则集,能按需求满足系统的运行;
“面向业务”的规则语言,使用者是最终用户。引擎会根据由开发人员定制的规则集,产生用于业务的规则集,由用户修改或拓展规则集,减少由于业务变化产生的维护麻烦等问题;
示例代码下载:https://files.cnblogs.com/duochunyu/EventDemoSource_061121.rar