Внедрение зависимостей при использовании шаблона команды - PullRequest
12 голосов
/ 08 июля 2011

Я впервые использую шаблон команд.Я немного не уверен, как мне обращаться с зависимостями.

В приведенном ниже коде мы отправляем 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);
    }
}

Большое спасибо
Бен

1 Ответ

14 голосов
/ 08 июля 2011

После просмотра вашего кода я бы рекомендовал не использовать шаблон команды, а вместо этого использовать объекты данных команды и обработчик команды:

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 со всеми настроенными зависимостями. Диспетчер или «шина сообщений» будет вызывать обработчик при получении команды.

Взгляните здесь , чтобы получить дополнительную информацию.

...