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