zoukankan      html  css  js  c++  java
  • 松耦合服务调用利器服务分发器

     

    引言   

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

    •   创建对象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代码

        

  • 相关阅读:
    定时自动备份数据库
    读<你必须知道的.NET>小结3
    [转载]手把手教你用C#打包应用程序(安装程序)【卸载模块已添加】
    集成测试
    P2P
    20110818炒股日记急拉慢跌的走势
    xp sp3安装IIS
    调用ASP.NET工作流:承载及限制
    20110822炒股日记进入筑底阶段
    用Duplex实现消息广播
  • 原文地址:https://www.cnblogs.com/netcasewqs/p/2293615.html
Copyright © 2011-2022 走看看