我正在尝试使用内置的.Net依赖注入重写.Net Core中的某些代码。以前,我使用当前代码创建实例(使用Unity for DI),效果很好。
var instance = (IPipe)UnityHelper.Container.Resolve(implementation);
对于.Net Core,我首先尝试使用标准Activator.CreateInstance
,并且运行良好,并创建了我期望的IPipe实例。
var instance = (IPipe)Activator.CreateInstance(implementation)
但是。那么问题是,如果实现在ctor中注入服务,那么它们将无法解决(这就是为什么我在上一个项目中使用Unity.Resolve来解决此问题的原因)。
经过研究,我发现了ActivatorUtilities
类,并将其替换为下面的代码(serviceProvider为IServiceProvider
)
var instance = ActivatorUtilities.CreateInstance<IPipe>(serviceProvider, implementation);
但是,我现在遇到了当前错误。
找不到适合“ IPipe”类型的构造函数。确保 该类型是具体的,并且已针对以下所有参数注册了服务 公共构造函数。
我不明白为什么Activator.CreateInstance
可以正常工作,但这是在抱怨IPipe构造函数吗?
答案 0 :(得分:5)
通用ActivatorUtilities.CreateInstance<T>(IServiceProvider, Object[])
实际上会创建类型T
的实例,并尝试使用服务提供商来解析该类型的构造函数参数。您可以传递的对象数组用于服务提供者未提供的附加构造函数参数。
如果只想创建运行时类型的实例并让DI容器注入依赖项,则将需要使用非通用的ActivatorUtilities.CreateInstance(IServiceProvider, Type, Object[])
。
该方法返回一个object
,因此,如果要使用它,则必须进行类型转换。例如:
var instance = (IPipe)ActivatorUtilities.CreateInstance(serviceProvider, pipeType);