.NET核心依赖注入解决问题

时间:2020-06-11 11:20:43

标签: c# .net-core dependency-injection

在启动WebApi项目时,我得到了下一个代码:

services.AddScoped<ICommandHandler<OpdrachtgeverToevoegenCommand>, OpdrachtgeverCommandHandler>();
services.AddScoped<ICommandHandler<OpdrachtgeverVerwijderenCommand>, OpdrachtgeverCommandHandler>();
services.AddScoped<ICommandHandler<OpdrachtgeverWijzigenCommand>, OpdrachtgeverCommandHandler>();

在我的项目中,我已经实现了这些接口。

现在,我正在尝试使用以下命令找到此处理程序的正确实现:

以下是尚未完成的代码:

public static ICommandHandler<ICommand> GetHandler(IServiceProvider serviceProvider, ICommand command)
{
    if (serviceProvider == null) throw new ArgumentNullException(nameof(serviceProvider));
    if (command == null) throw new ArgumentNullException(nameof(serviceProvider));

    var handler = serviceProvider.GetRequiredService(command.GetType());
    return serviceProvider.GetRequiredService(command.GetType()) as ICommandHandler<ICommand>;
}

我知道command.GetType()返回正确的命令,但是如何找到ICommandHandler<command.GetType()>的实现?

1 个答案:

答案 0 :(得分:2)

您可以使用import time while True: with open('Log.txt','a') as f: print("This prints once a second.",file=f) time.sleep(1) 动态创建您要查找的类型:

MakeGenericType

但是,这会给您带来问题,因为我假设 var handlerType = typeof(ICommandHandler<>).MakeGenericType(command.GetType()); return (ICommandHandler<ICommand>) serviceProvider.GetRequiredService(handlerType); 不是协变的。您将无法将其强制转换为ICommandHandler<>

最好将命令类型作为通用参数传递给方法。

ICommandHandler<ICommand>