2016-08-02 30 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