У меня проблемы с внедрением зависимости ядра asp.net, я не могу разрешить универсальный интерфейс из IServiceProvider. Вот мои настройки:
Общие интерфейсы:
public interface IRequest<out TResponse> {...}
public interface IRequestHandler<TRequest, TResult>
where TRequest : IRequest<TResult> {...}
Конкретная реализация:
public class GetUsersQuery : IRequest<IEnumerable<GetUsersResult>> {...}
public abstract class RequestHandler<TRequest, TResult>
: IRequestHandler<TRequest, TResult>
where TRequest : IRequest<TResult> {...}
public class GetUsersQueryHandler
: RequestHandler<GetUsersQuery, IEnumerable<GetUsersResult>> {...}
Тогда у меня есть фабрика сервисов, где я регистрирую внедрение зависимости следующим образом:
public static void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IRequestHandler<GetUsersQuery,
IEnumerable<GetUsersResult>>, GetUsersQueryHandler>();
}
Я могу успешно разрешить свой обработчик следующим образом:
var handler =
_services.GetService<IRequestHandler<GetUsersQuery, IEnumerable<GetUsersResult>>>();
Однако я хотел бы иметь универсальный метод в этой фабрике, который получает конкретную реализацию IRequest и возвращает соответствующий обработчик, не зная заранее точного типа, что-то вроде этого:
public Task<TResult> Execute<TResult>(IRequest<TResult> request)
{
var handler =
_services.GetService<IRequestHandler<IRequest<TResult>, TResult>>();
return handler.ExecuteAsync(request);
}
И вызовите этот метод так:
_serviceFactory.Execute(new GetUsersQuery(){});
К сожалению, это не работает, обработчик не разрешен и имеет значение null. Я чувствую, что это должно быть возможно, хотя.
Не могли бы вы сказать, что я делаю неправильно и как этого добиться?