我在 ASP.NET Core 依赖注入方面遇到问题,无法解析 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(){});
不幸的是,这不起作用,处理程序未解析并且为空。我觉得这应该是可能的。
你能告诉我我做错了什么以及如何实现这一目标吗?