所以我一直在为服务实现一个非常简单的命令接口,以便可以向其发送http cmds来控制它。
我正在努力解决的部分是执行命令的最佳方式,这将基于路线。我已经看到了很多关于命令模式的内容,这是有道理的,但有一点我正在尝试修改。在所有情况下,都有一个字典包含命令,有没有办法去掉字典,例如,查看类中的所有静态方法?我确信这可以通过反思来完成,但我还没有看到它的例子,当我寻找命令模式和反思时,大多数人都说要远离它
我的主要目标是确保如果有人添加命令,他们不会忘记将其添加到字典中,我知道我希望所有静态方法都能响应路由。
这是个好主意吗?还是我应该说去死吧,坚持正常的模式?
我应该使用HttpListener添加im,并使用与此类似的非常基本的web服务器多线程。Net HttpListener
我看到的命令模式最好的例子是使用命令和工厂设计模式执行排队作业
完整解决方案
//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);
}
}
第三次幸运!
下面是一些代码,可以找到实现特定接口的所有类型,例如ICommand接口。
在Dictionary<string, Type>
中注册每个类型——比如说,类型名称与类型。
收到请求时,获取类型。根据字典,做这样的事情;
var command = (ICommand)Activator.CreateInstance(commandType);
command.Execute();
因此,现在您有了一个系统,它可以在不必注册的情况下查找类型,并自动调度。
这有点基础,但这是一种过去对我有效的模式。
反射在ASP中同时使用。NET MVC和WebAPI。所以类上的一个方法
public class AccountController: Controller
{
public ActionResult Login(string username, string password)
...
}
Controller类和操作方法本身都是通过反射发现的,并由运行时调用。
当你谈论命令词典时,我猜你是在谈论像Nancy这样的库?
除非这是一次学习经历,否则我很想采用现有的解决方案。例如,如果ASP。NET MVC已经做到了你想要的,经过了战斗测试,并且很容易获得帮助,那么重新发明自己的轮子可能是一个错误。
您可能想看看MEF,它将为您完成发现部分,并且现在已构建到框架中。
然后你想要的是某种调度员。类似Nancy服务,路线类似:
Post["/:commandName"]=_=>{}
然后获取命令名称,并将其分派到相应的容器。
MEF中的链接包含一个带有单词"ImportMany"的部分,该部分显示了如何根据命令名调度命令。
作为必然结果;我已经成功地使用TopShelf和Nancy托管了一个响应HTTP的Windows服务。