松耦合服务调用利器-服务分发器
引言
对象和对象之间是通过消息来进行通信的。具体过程如下:
- 创建对象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 例子
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代码