2016-08-02 69 views
0

所以我一直在寻找impliment一个非常简单的服务命令接口,以便http cmds可以发送到它来控制它。命令模式与URL路由

im正在努力的部分是实现命令的最佳方式,这将基于路线。我已经在命令模式上看到了很多有意义的东西,但是有一件事是我试图修改的。在所有情况下,都有一个包含命令的字典,是否有一些方法可以摆脱字典,例如,查看一个类中的所有静态方法?我确定这可以通过反射来完成,但我还没有看到它的一个例子,并且当我查找大多数人说远离它的命令模式和反射时。

我的主要目标是确保如果有人添加一个命令,他们不会忘记将它添加到字典中,我知道我想要所有静态方法来响应路由。

这是一个好主意,还是我应该说拧它,只是坚持正常模式?

我应该用HttpListener与此类似 Multi-threading with .Net HttpListener

一个非常基本的Web服务器和最好的例子我见过的命令模式的什么即时希望做的是这个 using the command and factory design patterns for executing queued jobs

添加IM

完整的解决方案

//simple interface 
interface ICommand 
{ 
    bool Execute(); 
} 

//example cmd 
public class cmd_Restart:ICommand 
{ 
    public bool Execute() 
    { 
     //put your code here 
     //return true or false for success 
     logger.writeLog("It was called!"); 
     return true; 
    } 
} 

class commands 
{ 
    private static Dictionary<string, Type> _commands; 
    public commands() 
    { 
     loadCommands(); 
    } 

    public ICommand GetCommand(string cmdName) 
    { 
     //should probably be more complex to make sure its found 
     return (ICommand)Activator.CreateInstance(_commands[cmdName]); 
    } 

    private void loadCommands() 
    { 
     _commands = new Dictionary<string, Type>(); 
     var cmdType = typeof(ICommand); 

     _commands = AppDomain.CurrentDomain.GetAssemblies() 
      .First(a => a.GetName().Name == "DomoticzServiceManagerTest") 
      .GetTypes() 
      .Where(t => t.Name.StartsWith("cmd_")) 
      .ToDictionary(c => c.Name.Substring(4).ToLower(), 
          c => c); 
     } 
} 
+0

你应该从Asp.net 101开始。我很肯定它会覆盖那部分。 – Steve

+0

@steve很好,我没有使用ASP.NET或任何Web服务相关的技术。这将是一个Windows服务,你可以发送到命令也通过网址休息(ish)调用 – jrich523

回答

1

第三次幸运!

Here是一些代码,它将查找实现特定接口的所有类型,例如您的ICommand接口。

将每种类型注册到Dictionary<string, Type> - 类型名称与类型,比如说。

当请求进入时,获取类型。从字典中做这样的事情;

var command = (ICommand)Activator.CreateInstance(commandType); 
command.Execute(); 

所以现在你已经有了一个系统,可以找到类型而不必注册它们,并自动调度。

这有点基本,但它是一种在过去为我工作的模式。

+1

得到它的工作!用完整的解决方案更新问题,谢谢! – jrich523

0

反射无论是在ASP.NET MVC和的WebAPI使用。因此,类上的方法

public class AccountController: Controller 
{ 
    public ActionResult Login(string username, string password) 
    ... 
} 

控制器类和操作方法本身都是通过反射来发现并由运行时调用的。

当你谈论命令字典时,我想你正在谈论像Nancy这样的图书馆?

我很想试试用现有的解决方案,除非这是一种学习体验。例如,如果ASP.NET MVC已经做了你想做的事情,经过了战斗测试,并且很容易获得帮助,那么重新发明自己的车轮可能是一个错误。

+0

这就是即时通讯谈论http://stackoverflow.com/questions/8788366/using-the-command-and-factory -design-patterns-for-execution-queued-jobs – jrich523

+0

很酷。我发布了一个基于MEF的答案,可能会更适合你。 –

0

你可能想看看MEF,它会为你做发现的一部分,现在已经构建在框架中。

然后你想要的是某种调度器。像一个南西服务与像路线:

发表[“/:命令名”] = _ => {}

然后拿起命令名和分派到适当的容器中。

MEF中的链接包含一个单词'ImportMany',它显示了如何根据命令名称分派命令。

作为必然结果;我已经成功地使用了TopShelf和Nancy来托管响应HTTP的Windows服务。

+0

嗯,我以前使用过MEF,但是对于更多的真正的插件系统,不是基本的东西。即时通讯不知道我想为此添加额外开销,但我会玩它 – jrich523