14

初めてコマンド パターンを使用します。依存関係をどのように処理すればよいか、少しわかりません。

以下のコードでは、 をディスパッチCreateProductCommandし、後で実行するためにキューに入れます。このコマンドは、実行に必要なすべての情報をカプセル化します。

この場合、製品を作成するために何らかのタイプのデータ ストアにアクセスする必要がある可能性があります。私の質問は、この依存関係をコマンドに挿入して実行できるようにするにはどうすればよいですか?

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);
    }
}

どうもありがとう
ベン

4

1 に答える 1

16

コードを確認した後、コマンド パターンを使用するのではなく、代わりにコマンド データ オブジェクトとコマンド ハンドラーを使用することをお勧めします。

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) {

    }
}

このシナリオは、CreateProductCommand がアプリケーションの境界を越える必要がある場合により適しています。また、CreateProductCommand のインスタンスを、すべての依存関係が構成された DI コンテナーによって解決することもできます。ディスパッチャまたは「メッセージ バス」は、コマンドを受信するとハンドラを呼び出します。

背景情報については、こちらをご覧ください。

于 2011-07-07T23:50:21.130 に答える