代码之家  ›  专栏  ›  技术社区  ›  YodasMyDad

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

  •  1
  • YodasMyDad  · 技术社区  · 6 年前

    我正在尝试使用内置的.Net依赖注入重写.Net内核中的一些代码。以前,我使用当前代码创建实例(它使用Unity for DI),这非常有效。

    var instance = (IPipe)UnityHelper.Container.Resolve(implementation);
    

    对于.Net核心,我首先尝试了标准 Activator.CreateInstance

    var instance = (IPipe)Activator.CreateInstance(implementation)
    

    然而。那么问题是,如果实现在ctor中注入服务,那么它们将不会被解决(这就是为什么我在上一个项目中使用Unity.Resolve来解决这个问题)。

    经过研究,我发现 ActivatorUtilities IServiceProvider )

    var instance = ActivatorUtilities.CreateInstance<IPipe>(serviceProvider, implementation);
    

    但是,我现在得到了当前的错误。

    该类型是具体的,并且为的所有参数注册了服务 公共构造函数。

    我不明白为什么 工作正常,但这是抱怨ipippe构造函数?

    1 回复  |  直到 6 年前
        1
  •  15
  •   poke    6 年前

    泛型 ActivatorUtilities.CreateInstance<T>(IServiceProvider, Object[]) 将实际创建类型的实例 T 并尝试使用服务提供程序解析类型构造函数参数。可以传递的对象数组是 额外的

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

    该方法返回 object ,所以如果您想使用它,就必须键入cast。例如:

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