2017-02-21 2 views
1

첫 번째 IMediatR, Autofac MVC 프로젝트에서 문제가 발생합니다. 도움이 많이 감사드립니다 .. 미리 감사드립니다!MediatR Autofac Handler가 컨테이너에 등록되었습니다.

SliceProject.Services.Query.GetUserListQuery 유형의 요청에 대해 처리기를 찾을 수 없습니다. 컨테이너 또는 서비스 로케이터가 올바르게 구성되지 않았거나 처리기가 컨테이너에 등록되지 않았습니다.

Autofac 컨테이너 코드 : 당신이 IRequestHandler<TRequest, TResponse> 유형을 포함하는 어셈블리에보고 Autofac을 이야기하고 있기 때문에입니다

builder 
    .RegisterAssemblyTypes(typeof(IRequest<>).Assembly) 
    .Where(t => t.IsClosedTypeOf(typeof(IRequest<>))) 
    .AsImplementedInterfaces();  

builder 
    .RegisterAssemblyTypes(typeof(IRequestHandler<,>).Assembly) 
    .Where(t => t.IsClosedTypeOf(typeof(IRequestHandler<,>))) 
    .AsImplementedInterfaces(); 

답변

2

. 그 유형은 MediatR 어셈블리에 있으므로 처리기가 해당 어셈블리에있을 가능성이 없습니다.

핸들러가 정의 된 어셈블리를 볼 수 있도록 등록해야합니다. 그것들이 모두 하나의 어셈블리에 정의되어 있다면 하나의 핸들러를 선택하여이를 마커 유형으로 사용하십시오.

builder 
    .RegisterAssemblyTypes(typeof(GetUserListQueryHandler).Assembly) 
    .Where(t => t.IsClosedTypeOf(typeof(IRequestHandler<,>))) 
    .AsImplementedInterfaces(); 

도 등록이 Autofac, AsClosedTypesOf에서 제공하는 funciton으로 간단하게 할 수 있습니다 : 여기 당신의 핸들러 중 하나의 이름을 추측했습니다. 그것은 똑같은 일을합니다.

builder 
    .RegisterAssemblyTypes(typeof(GetUserListQueryHandler).Assembly) 
    .AsClosedTypesOf(typeof(IRequestHandler<,>))); 
마지막으로

,이 조금 관련이없는,하지만 당신은 왜 컨테이너에 요청을 등록하려고합니까? 요청은 일반적으로 사용자 지정 코드에 의해 만들어지며 컨테이너에서 해결되지 않습니다. 귀하의 경우에는 핸들러와 동일한 실수를했기 때문에 효과가 없습니다. 즉, IRequest<TResponse>의 구현을 포함하지 않는 MediatR 어셈블리의 요청을 찾고 있습니다.

관련 문제