2011-07-07 18 views
11

私は初めてコマンドパターンを使用しています。私は依存性をどのように処理すべきか少し不明です。コマンドパターン使用時の依存性注入

以下のコードでは、CreateProductCommandを送信し、後で実行するようにキューに入れます。このコマンドは、実行する必要があるすべての情報をカプセル化します。

この場合、製品を作成するために、ある種のデータストアにアクセスする必要があります。私の質問は、この依存関係をコマンドに注入して実行する方法です。

public interface ICommand { } 

public interface ICommandHandler<TCommand> where TCommand : ICommand { 
    void Handle(TCommand command); 
} 

public class CreateProductCommand : ICommand { } 

public class CreateProductCommandHandler : ICommandHandler<CreateProductCommand> { 
    public void Handle(CreateProductCommand command) { 

    } 
} 

このシナリオ:

public interface ICommand { 
    void Execute(); 
} 

public class CreateProductCommand : ICommand { 
    private string productName; 

    public CreateProductCommand(string productName) { 
     this.ProductName = productName; 
    } 

    public void Execute() { 
     // save product 
    } 
} 

public class Dispatcher { 
    public void Dispatch<TCommand>(TCommand command) where TCommand : ICommand { 
     // save command to queue 
    } 
} 

public class CommandInvoker { 
    public void Run() { 

     // get queue 

     while (true) { 
      var command = queue.Dequeue<ICommand>(); 
      command.Execute(); 
      Thread.Sleep(10000); 
     } 
    } 
} 

public class Client { 
    public void CreateProduct(string productName) { 
     var command = new CreateProductCommand(productName); 
     var dispatcher = new Dispatcher(); 
     dispatcher.Dispatch(command); 
    } 
} 

感謝
ベン

答えて

13

あなたのコードを見た後、私は、コマンドパターンを使用して、代わりにコマンド・データ・オブジェクトおよびコマンドハンドラを使用していないお勧めしますCreateProductCommandがアプリケーションの境界を越える必要がある場合に適しています。また、CreateProductCommandのインスタンスをすべての依存関係が設定されたDIコンテナで解決することもできます。ディスパッチャまたは 'メッセージバス'は、コマンドを受け取ったときにハンドラを起動します。

背景情報についてはhereをご覧ください。

+0

ありがとうございます。ツイッターのCQRSフォークもこの方向に私を指摘していました。 –

+0

CQRSがなくても、上記のようなデザインには大きなメリットがあります。ここには[このパターンに関する有益な記事](http://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=91)があります。 – Steven