OK Я только что применил шаблон Command-CommandHandler в нашем приложении, который добавляет объект команды в очередь; затем использует инъекцию зависимостей через Castle Windsor наряду с общим методом, чтобы получить соответствующий обработчик для объекта команды.Передача типа класса вместо интерфейса через генераторы
Интерфейс командной пустым следующим образом:
public interface ICommand
{
}
Хотя интерфейс CommandHandler обрабатывает его следующим образом:
public interface ICommandHandler<TCommand> where TCommand : ICommand
{
void Handle(TCommand command);
}
, которые затем реализуются с помощью команды я желаю послать через очереди; затем регистрируется в замок Виндзор через DependencyRegistration обертку так:
_dependencyRegister
.AddRegistration<ICommandHandler<TestCommand>, TestCommandHandler>();
Таким образом, каждая команда, которая будет добавлена в очередь карт 1 к 1 с обработчиком; затем зарегистрирован в замке Виндзор; поэтому мы можем использовать универсальный метод, как это, чтобы получить соответствующую CommandHandler для конкретного объекта Command:
private void HandleCommand<T>(T queueItem) where T: ICommand
{
var handler = _dependencyResolver.Resolve<ICommandHandler<T>>();
handler.Handle(queueItem);
}
Заключительная часть является метод очереди диспетчера, который выглядит следующим образом:
private void DispatchQueueItem(ICommand queueItem)
{
HandleCommand(queueItem);
}
справа; проблема в том, что когда я вывожу команду из очереди в качестве ICommand и передаю ее методу DispatchQueueItem; когда он отправляется методу HandleCommand, тип «T» всегда устанавливается в интерфейс «ICommand»; а не фактической реализации интерфейса (TestCommand в образце кода DependencyRegistration).
Мой вопрос: как установить метод HandleCommand для реализации типа реализации; не интерфейс?
Одна секунда для дублирования этой общей установки. Я подозреваю, что '' DispatchQueueItem'' '' как 'ICommand', что общий аргумент' HandleCommand' выводится из типа boxed. – Tejs
Общая конструкция (T) - это временное разрешение компиляции типа. Вы ищете разрешение типа времени выполнения. Для этого вам придется использовать динамический тип или отражение. – user957902