62,017
社区成员
发帖
与我相关
我的任务
分享
public abstract class MyCommand<S, R> : IMyCommand
{
public dynamic Execute(JObject input)
{
return Execute(input.ToObject<S>());
}
public abstract R Execute(S input);
}
才对,也就是说把原本对于 IMyCommand 的 Execute 的弱类型调用委派给新的强类型的 Execute 调用。这样以后的自定义服务类型就都从 MyCommand 继承,只写(并且只能写)强类型的 Execute 而不需要写任何弱类型的 Execute 实现了。 public abstract class MyCommand<S, R> : IMyCommand
{
public dynamic Execute(JObject input)
{
throw new NotImplementedException();
}
public R Execute(S input)
{
return (R)Execute(input);
}
}
这样的类型封装,就能将原来弱类型的 IMyCommand 转而封装为强类型的,从而你的真正的所有的服务都是从 MyCommand<,> 继承的而不是从弱类型 IMyCommand 继承。
诸如此类的扩展,例如你可以扩展接口,或者扩展 Attribute 定义,来实现类似于“设置服务权限”等等等等你需要自己扩展的功能。关键是说,从根源上掌握机构设计主动权。 public interface IMyCommand
{
dynamic Execute(JObject input);
}
public class Handler1 : IHttpHandler
{
private static Dictionary<string, Type> Commands = new Dictionary<string, Type> {
{ "给我一支笔", typeof(给你笔) },
{ "abc", typeof(另外一个服务)} };
public void ProcessRequest(HttpContext context)
{
var reader = new StreamReader(context.Request.InputStream);
var text = reader.ReadToEnd(); //断点调试这里,可以得到客户端的所有提交的 string
var obj = JObject.Parse(text); //从收到的 string 转换为 Json 格式
var commandName = (string)obj["ServiceName"];
if (Commands.TryGetValue(commandName, out Type h))
{
var run = (IMyCommand)Activator.CreateInstance(h);
var result = run.Execute(obj);
context.Response.Write(JsonConvert.SerializeObject(result));
}
else
context.Response.StatusCode = 404;
}
public bool IsReusable
{
get
{
return false;
}
}
}
public class 给你笔 : IMyCommand
{
public dynamic Execute(JObject input)
{
return "你要笔是" + (string)input["型号"] + "的?";
}
}
public class 另外一个服务 : IMyCommand
{
public dynamic Execute(JObject input)
{
return null;
}
}
这里,用一个 commands 字典来把自己的凡是能解析执行 IMyCommand 接口的命令(这里写了2个例子)注册一下,然后这个 ashx 就可以自动承载所有的服务请求接入和输出工作了。这里用简洁的代码,从这个简单的demo开始,自己把控的每一个细节,你可以插入各种预定义处理,进行各种优化。一切都在自己掌控。