Поиск обработчика запроса в QueryBus с помощью Castle Windsor - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь создать приложение с CQRS и реализовать QueryBus. Есть мои запросы: общий и один конкретный запрос с обработчиком

public interface IQuery<TResult> { }

public interface IQueryHandler<TQuery, TResult> where TQuery : IQuery<TResult>
{
    TResult Execute(TQuery query);
}

public class PeriodPlanListQuery : IQuery<object> { }

public class PeriodPlanListQueryHandler : IQueryHandler<PeriodPlanListQuery, object>
{
    public object Execute(PeriodPlanListQuery query)
    {
        return new { };
    }
}

Я использую Виндзорский замок для разрешения зависимостей

        container.Register(
            Component.For<IQueryHandler<PeriodPlanListQuery, object>>()
                .ImplementedBy<PeriodPlanListQueryHandler>()
                .LifestylePerWebRequest());

Там в моей реализации метода QueryBus

    public TResult Send<TResult>(IQuery<TResult> query)
    {
        var handler = _container.Resolve<IQueryHandler<IQuery<TResult>, TResult>>();
        if (handler == null)
            throw new NotSupportedException(query.GetType().FullName);

        var result = handler.Execute(query);
        return result;
    }

Я получил ошибку, пропустив компонент, мой вопрос в том, что неправильно, моя реализация QueryBus или регистрация в компоненте

Нет компонента для поддержки сервиса Domain.IQueryHandler 2[[Domain.IQuery 1 [[System.Object, mscorlib, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089]], JP.Planner.Domain, версия = 1.0.0.0, Культура = нейтральная, PublicKeyToken = ноль], [System.Object, mscorlib, Версия = 4.0.0.0, Культура = нейтральная, PublicKeyToken = b77a5c561934e089]] был найден

1 Ответ

0 голосов
/ 07 сентября 2018

Похоже, PeriodPlanListQueryHandler зарегистрирован, чтобы выставить IQueryHandler<PeriodPlanListQuery, object>, но вы пытаетесь разрешить IQueryHandler<IQuery<object>, object>.

Оба конца должны точно совпадать, чтобы это работало.

Сейчас ваша модель не может работать, поэтому, возможно, ее придется перенастроить. Я бы посоветовал забыть Виндзор на мгновение и попытаться разобраться в простом C # без библиотек.

Текущий код эффективно пытается сделать:

IQueryHandler<IQuery<object>, object> h = new PeriodPlanListQueryHandler();

Это недопустимый C # и не будет компилироваться, и поэтому ваша конфигурация Windsor не работает так, как вы ожидали.

Попробуйте выяснить модель, которая соответствует вашим потребностям за пределами Виндзора, и тогда должно быть довольно просто, как настроить Виндзор для этой модели.

...