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

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

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

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


person Ben Foster    schedule 07.07.2011    source источник


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

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

person eulerfx    schedule 07.07.2011
comment
Спасибо за это. Люди CQRS в твиттере также указали мне в этом направлении. - person Ben Foster; 08.07.2011
comment
И даже без CQRS описанная выше конструкция имеет большие преимущества. Вот информационная статья об этом шаблоне. - person Steven; 18.06.2013