Внедрение зависимостей при использовании шаблона команды

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

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

Решение

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

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

Посмотрите здесь для получения дополнительной информации.

Другие вопросы по тегам