2016-08-02 3 views
0

私は、サービスのための非常に単純なコマンドインターフェイスを念入りにして、http cmdsがそれを制御するために送信できるようにしています。URLルーティングを持つコマンドパターン

苦労している部分は、ルートに基づいたコマンドを実装するための最良の方法です。私はコマンドパターンに多くのものを見てきましたが、修正しようとしていることが1つあります。すべての場合に、コマンドを持つ辞書があります。辞書を取り除くための方法がありますか?たとえば、クラス内のすべての静的メソッドを見ますか?私はこれを反射で行うことができると確信していますが、私はまだ例を見ていません。そして、私がコマンドパターンと反射を探すとき、ほとんどの人はそれから離れていると言います。

私の主な目標は、誰かがコマンドを追加して辞書に追加するのを忘れないようにすることです。すべての静的メソッドがルートに応答するようにします。

これはいいアイデアですか、それともねじを締めて、普通のパターンに固執すべきですか?

私はこの Multi-threading with .Net HttpListener

に似た非常に基本的なWebサーバーとHttpListenerをを使用してイムを追加する必要がありますし、私はイムが何を探して何のためにコマンドパターンで見た中で最高の例では、これは using the command and factory design patterns for executing queued jobs

です

完全なソリューション

//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サービス関連の技術を使用していません。これは、あなたがあまりにもurl rest(ish)コールを介してコマンドに送ることができるWindowsサービスになるでしょう – jrich523

答えて

1

第3回ラッキー!

Hereは、特定のインターフェイス(ICommandインターフェイスなど)を実装するすべてのタイプを見つけるコードです。

Dictionary<string, Type>タイプの名前vsタイプにそれぞれのタイプを登録します。

リクエストが来たら、タイプを取得します。辞書の中からこのようなことをしてください。

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

hmm、以前はMEFを使っていましたが、実際のプラグインシステムのほうが、この基本的なものではありません。私はこれのためのオーバーヘッドを追加したいのですが、私はそれと一緒に遊ぶでしょう – jrich523