使用 ActivatorUtilities.CreateInstance 从类型创建实例
Using ActivatorUtilities.CreateInstance To Create Instance From Type
我正在尝试使用内置的 .Net 依赖注入在 .Net Core 中重写一些代码。以前,我使用当前代码创建实例(它使用 Unity 进行 DI),效果很好。
var instance = (IPipe)UnityHelper.Container.Resolve(implementation);
对于 .Net Core,我首先尝试了标准 Activator.CreateInstance
,这工作正常并创建了我期望的 IPipe 实例。
var instance = (IPipe)Activator.CreateInstance(implementation)
不过。那么问题是,如果实现在 ctor 中注入服务,那么它们将不会得到解决(这就是为什么我在之前的项目中使用 Unity.Resolve 来解决这个问题)。
经过一些研究,我发现了 ActivatorUtilities
class 并且我已将其换成下面的代码(serviceProvider 是 IServiceProvider
)
var instance = ActivatorUtilities.CreateInstance<IPipe>(serviceProvider, implementation);
但是,我现在收到当前错误。
A suitable constructor for type 'IPipe' could not be located. Ensure
the type is concrete and services are registered for all parameters of
a public constructor.
我不明白为什么 Activator.CreateInstance
工作正常,但这是在抱怨 IPipe 构造函数?
泛型 ActivatorUtilities.CreateInstance<T>(IServiceProvider, Object[])
实际上会创建一个类型 T
的实例,并尝试使用服务提供者解析该类型的构造函数参数。您可以传递的对象数组用于服务提供商未提供的其他 构造函数参数。
如果您只想创建一个运行时类型的实例并让 DI 容器注入依赖项,那么您将需要使用非泛型 ActivatorUtilities.CreateInstance(IServiceProvider, Type, Object[])
.
那个方法 returns 和 object
,所以如果你想使用它,你必须对它进行类型转换。例如:
var instance = (IPipe)ActivatorUtilities.CreateInstance(serviceProvider, pipeType);
我正在尝试使用内置的 .Net 依赖注入在 .Net Core 中重写一些代码。以前,我使用当前代码创建实例(它使用 Unity 进行 DI),效果很好。
var instance = (IPipe)UnityHelper.Container.Resolve(implementation);
对于 .Net Core,我首先尝试了标准 Activator.CreateInstance
,这工作正常并创建了我期望的 IPipe 实例。
var instance = (IPipe)Activator.CreateInstance(implementation)
不过。那么问题是,如果实现在 ctor 中注入服务,那么它们将不会得到解决(这就是为什么我在之前的项目中使用 Unity.Resolve 来解决这个问题)。
经过一些研究,我发现了 ActivatorUtilities
class 并且我已将其换成下面的代码(serviceProvider 是 IServiceProvider
)
var instance = ActivatorUtilities.CreateInstance<IPipe>(serviceProvider, implementation);
但是,我现在收到当前错误。
A suitable constructor for type 'IPipe' could not be located. Ensure the type is concrete and services are registered for all parameters of a public constructor.
我不明白为什么 Activator.CreateInstance
工作正常,但这是在抱怨 IPipe 构造函数?
泛型 ActivatorUtilities.CreateInstance<T>(IServiceProvider, Object[])
实际上会创建一个类型 T
的实例,并尝试使用服务提供者解析该类型的构造函数参数。您可以传递的对象数组用于服务提供商未提供的其他 构造函数参数。
如果您只想创建一个运行时类型的实例并让 DI 容器注入依赖项,那么您将需要使用非泛型 ActivatorUtilities.CreateInstance(IServiceProvider, Type, Object[])
.
那个方法 returns 和 object
,所以如果你想使用它,你必须对它进行类型转换。例如:
var instance = (IPipe)ActivatorUtilities.CreateInstance(serviceProvider, pipeType);