110,534
社区成员
发帖
与我相关
我的任务
分享
public interface ICommand
{
object parameter { get; set; }
object Execute();
}
public abstract class Command<T, S> : ICommand
{
public abstract S Execute(T parameter);
public object Execute()
{
return Execute((T)parameter);
}
public object parameter{get;set;}
}
public class Hello : Command<string, string>
{
public override string Execute(string parameter)
{
return "hello, " + parameter + "!";
}
}
var cmd = new Hello();
cmd.parameter="baby";
var result = cmd.Execute();
你可以看到,这个封装为独立对象的BLL命令被执行了,并且返回了期望的值。 private static Dictionary<string, Type> _commands = null;
public static Dictionary<string, Type> Commands
{
get
{
if (_commands == null)
{
_commands = AppDomain.CurrentDomain
.GetAssemblies()
.SelectMany(asm => asm.GetTypes())
.Where(type => typeof(ICommand).IsAssignableFrom(type))
.Where(type => type.IsClass && !type.IsAbstract)
.ToDictionary(x => x.FullName, x => x);
}
return Program._commands;
}
}
测试一下你能得到什么结果?你会看到你的程序可以将以 ConsoleApplication1.Hello 为键,在词典中收集了它所对应的ICommand实际实现类型Hello类型。这就是BLL扩展的基础。var commandType = "ConsoleApplication1.Hello";
var input="{\"parameter\":\"baby\"}";
var cmd = JsonConvert.DeserializeObject(input, Commands[commandType]) as ICommand ;
var result = cmd.Execute();
var output = JsonConvert.SerializeObject(result);
执行它,你可以看到output里边已经准备好了返回给客户端的json字符串了。namespace ConsoleApplication1
{
public class Hello
{
public string parameter;
}
.....
你可以看到,我这里使用了field而不是property。这完全没有关系!客户端对Hello命令的定义完全不必跟服务器端完全一致,甚至客户端多一些属性、少一些属性也无所谓,因为json都可以将其反序列化为服务器端的Hello命令。