KJFramework.Dynamic 动态服务框架

        KJFramework内置了一套基于组件模式的动态服务解决方案,该解决方案被命名为: KJFramework.Dynamic(动态服务框架).
使用者可以通过使用动态服务框架来构建自己的服务,由于该框架是基于组件模式设计的,所以在使用本框架时,
最起码要对自己的服务进行足够多的业务了解,只有这样,才能为一个服务分为多个逻辑层次,每个逻辑层次互相独立(当然,也可以互相通讯)
我们提倡,为每一个已分割的逻辑层单独设计成为一个组件(Component), 该组件派生自DynamicDomainComponent即可。
当然,我们还需要一个动态服务类,用户直接使用框架内部的DynamicDomainService即可。 在一般场景下,我们会在一个可执行程序中
去初始化我们的DynamicDomainService。 而在DynamicDomainService内部,它将会初始化每一个属于自己的组件。

        在框架内部, 我们为组件设计了通讯隧道(Tunnel)的能力,一个通讯隧道(Tunnel),在组件内部表示为一个IPC通讯信道。
这种通讯信道,直接的为同一个进程跨组件的数据交互提供了高性能的通讯能力。当然,我们并不会把一个赤裸裸的IPC通讯信道暴露给使用者,
因为这是非常丑陋的。 我们会使用一个KJFramework内部的RPC框架对该IPC通讯信道进行包装。也就是说,用户只需要简简单单的为需要
组件间交互的数据设计一个RPC服务接口和实现即可。 我们的动态组件(Component)将会有能力来帮助使用者自动的去开放这个RPC服务。

        在组件内部,我们可以通过使用隧道访问者(Tunnel Visitor)来访问同一个进程内部其余组件所开放的RPC服务(当然,前提是要访问的组件开放了RPC服务)
请不要担心,我们在这里为使用者设计了最简易的使用方式,一个组件想调用另一个组件所开放的RPC,只需要为一个隧道访问者(Tunnel Visitor)传递
目标组件的名称即可,隧道访问者(Tunnel Visitor)将会自动找到目标组件的RPC服务地址,并且进行连接。

        如果您选择使用KJFramework.Dynamic(动态服务框架)来构建服务,那么很荣幸,框架内部已经为您的服务和组件提供了动态更新的能力。
您需要做的,仅仅是在需要动态更新的场景下,去调用DynamicDomainService的相关能力即可,这一切都是那么的简单。

 

 *自定义组件

//自定义组件的话,必须派生自*DynamicDomainComponent*
public class MyComponent : DynamicDomainComponent
{
  /*Some code here.*/
}

 


 *组件开放内部RPC

//自定义组件的话,必须派生自*DynamicDomainComponent*
public class MyComponent : DynamicDomainComponent
{
  /*Some code here.*/

  protected override void InnerStart()
  {
      /*Some code here.*/

      //使用内部通讯隧道,T为用户自定义的服务实现类型
      UseTunnel<T>();
  }
}



 *动态服务的使用

//在一个可执行文件的内部,直接使用框架内部提供的DynamicDomainService类即可
DynamicDomainService service = new DynamicDomainService(new ServiceDescriptionInfo
                                             {
                                                 Name = "Test Service", 
                                                 ServiceName = "Demo1.TestService"
                                             });
service.Start();

 

 *组件内部通过隧道访问者去调用另一个组件的RPC服务

//自定义组件的话,必须派生自*DynamicDomainComponent*
public class MyComponent : DynamicDomainComponent
{
  /*Some code here.*/

  protected void CallTargetComponent()
  {
      //假设IConnectorComponentContract是目标组件开放的RPC服务契约
      //为一个隧道访问器传入目标方组件名称即可
      //每一个组件内部都会包含一个隧道访问器的实例!
      IConnectorComponentContract contract = this.TunnelVisitor.GetTunnel<IConnectorComponentContract>("DSC.Components.Connector");
      if (contract == null)
      {
         ConsoleHelper.PrintLine("Cannot transport an object to component tunnel, because target tunnel is null. #name: DSC.Components.Connector.", ConsoleColor.DarkRed);
         return;
      }
      //直接使用契约接口就可以了
      contract.Transport(/*Some args here.*/);
  }
}

Last edited Nov 17, 2011 at 1:57 AM by g0194776, version 20