使用ActivatorUtilities.CreateInstance从类型创建实例

时间:2018-10-04 10:30:55

标签: c# asp.net-core .net-core asp.net-core-2.0

我正在尝试使用内置的.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构造函数吗?

1 个答案:

答案 0 :(得分:5)

通用ActivatorUtilities.CreateInstance<T>(IServiceProvider, Object[])实际上会创建类型T的实例,并尝试使用服务提供商来解析该类型的构造函数参数。您可以传递的对象数组用于服务提供者未提供的附加构造函数参数。

如果只想创建运行时类型的实例并让DI容器注入依赖项,则将需要使用非通用的ActivatorUtilities.CreateInstance(IServiceProvider, Type, Object[])

该方法返回一个object,因此,如果要使用它,则必须进行类型转换。例如:

var instance = (IPipe)ActivatorUtilities.CreateInstance(serviceProvider, pipeType);