使用 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);