Quartet Lounge Team 2006
A dedicated team on the .Net open source frameworking.

Sloth 实战2

  ---SlothSlothAgent

 

Sloth中使用远程服务对象

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

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

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

       

 public override object InitializeLifetimeService()

        
{

            
return null;

        }


 

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

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

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

   5_1.JPG

利用远程事件,绕开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 业务规则引擎

规则语言分为两类:

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

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

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

posted on 2006-11-22 16:35  QuartetLounge  阅读(1776)  评论(2编辑  收藏  举报