松耦合服务调用利器-服务分发器

 

引言   

    对象和对象之间是通过消息来进行通信的。具体过程如下:

  •   创建对象a
  •   创建对象b
  •   创建请求消息request
  •   调用对象b的方法
  •    对象b返回对应的response

通过上面的过程可以看出通信的调用方需要依赖如下元素:

  • 被调用方 (服务契约)
  • 请求消息request( 数据契约)
  • 被调用方的方法(操作契约)
  • 响应消息(数据契约)

那么我们可以把通信的过程通过引入一个间接层-服务分发器来解耦对象间的之间通信,具体过程如下:

  •   创建对象a
  •   创建服务分发器dipatcher
  •   创建请求消息request
  •   调用分发器的分发方法
  •   分发器创建对象b,并调用对象b的方法
  •    对象b返回对应的response 给分发器,分发器把response结果返回给对象a

服务分发器接口定义

  定义服务分发器接口

 
   [Contract]
public interface IServiceDispatcher
{
IServiceResponse Dispatch(IServiceRequest req);
}

  定义请求接口
    public inter  IServiceRequest
    {
        string ServiceName { get; }
        string OperationName { get; }
        IDictionary<string,object> Arguments { get; }
    }
  定义响应接口
    public interface IServiceResponse 
    {
        bool Success { get; }
        object Result { get; set; }
        Exception[] Exceptions { get; }
    }
   定义服务分发器门面类ServiceDispatcher
    public static class ServiceDispatcher
    {
      public static IServiceResponse Dispatch(IServiceRequest req);
      public static TResult Dispatch<TResult>(string serviceName, string operationName);
      public static TResult Dispatch<TResult>(string serviceName, string operationName, object requestArgs)
     }

服务分发器功能特征

  •   服务类不能是抽象的
  •   服务类必须以“Service”结尾(效仿mvc控制器的约定)
  •   服务类支持别名
  •   服务Action必须是BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public
  •   如果服务Action上含有IgnoreAttribute标签则忽略
  •   服务Action支持方法重载
  •   服务Action支持别名
  •   服务Action暂不支持引用参数和输出参数  
  •   支持参数模型绑定机制
  •   支持Filter机制
  •   支持分布式调用
  •  支持和MVC进行整合(把控制器的功能整合到服务中,不需要开发控制器)
  •  整合Mini容器

 

Demo 例子

  1. 添加NLite.dll 引用(可以从NLite 官网下载)
  2. 添加Ndf.dll 引用 (可以从 Ndf官网下载)
  3. 创建一个CalculateService
using NLite;
namespace ConsoleDemo
{
    [Component]
    public class CalculateService
    {
        public int Add(int a, int b)
        {
            return a + b;
        }
        public int Sub(int a, int b)
        {
            return a - b;
        }
        public int Multiply(int a, int b)
        {
            return a * b;
        }
        public int Divide(int a, int b)
        {
            return a / b;
        }
    }
}

 

4. 添加测试程序

using System;
using NLite;
using NLite.Cfg;
using NLite.Domain;

namespace ConsoleDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            //Config Ndf 组件
            new Configuration().Configure();

            //Registery CalculteService in current assembly
            ServiceRegistry.RegisteryFromAssemblyOf<Program>();

            //call CalculteService.Add method
            int result = ServiceDispatcher.Dispatch<int>("calculate", "add", new { a = 2, b = 3 });
            Console.WriteLine("2 + 3 = " + result.ToString());

            //call CalculteService.Sub method
            result = ServiceDispatcher.Dispatch<int>("calculate", "sub", new { a = 2, b = 3 });
            Console.WriteLine("2 - 3 = " + result.ToString());

            //call CalculteService.Multiply method
            result = ServiceDispatcher.Dispatch<int>("calculate", "multiply", new { a = 2, b = 3 });
            Console.WriteLine("2 * 3 = " + result.ToString());

            //call CalculteService.Divide method
            result = ServiceDispatcher.Dispatch<int>("calculate", "divide", new { a = 2, b = 3 });
            Console.WriteLine("2 / 3 = " + result.ToString());

            Console.Read();
        }
    }
}

运行结果如下:

 

最后附上Demo代码

    

posted @ 2011-12-19 17:23  风云  阅读(1648)  评论(6编辑  收藏  举报