引言
对象和对象之间是通过消息来进行通信的。具体过程如下:
- 创建对象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 例子
- 添加NLite.dll 引用(可以从NLite 官网下载)
- 添加Ndf.dll 引用 (可以从 Ndf官网下载)
- 创建一个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代码