Подтвердить что ты не робот

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

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

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

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

4b9b3361

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

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