【问题标题】:.NET Core Dependency Injection - Resolve implementations and IEnumerable of interface.NET Core 依赖注入 - 解析接口的实现和 IEnumerable
【发布时间】:2020-02-05 09:34:12
【问题描述】:

我有一个接口IMyType,有几个实现SomeMyTypeOtherMyType

我想同时使用具体类型,以及实现IMyType 接口的所有类型的 IEnumerable。

这些可以是服务中的声明。

private readonly IEnumerable<IMyType> instances;
private readonly SomeMyType someType;
private readonly OtherMyType otherType;

实现这项工作的一种方法是使用以下扩展:

public static IServiceCollection AddMyType<T>(this IServiceCollection serviceCollection)
    where T : class, IMyType =>
    serviceCollection
        .AddSingleton(typeof(IMyType), typeof(T))
        .AddSingleton(typeof(T));

这为具体类型和接口添加了一个单例。

这是配置依赖项的好方法吗?

还有其他改进解决方案的方法吗?我在想这是否会创建两个 T 实例,或者框架是否尝试用第一个 T 解析第二个单例。

【问题讨论】:

  • 你到底想达到什么目的?让我们假设您的 IEnumerable 是一个列表。当您想“注入”您List&lt;IMyType&gt; 时,您希望列表中出现什么?
  • 我希望IMyType 的所有实现都在列表中。我想在所有这些上运行一个方法,我不在乎它们有什么类型。我还想针对特定类型运行特定方法。
  • 我假设您的列表经常更改或非常大?否则,您可以创建一个实际提供此列表的专用类/服务,并且此提供程序类本身具有所有可能的实现(SomeMyType、OtherMyType)作为依赖项并完成创建列表的工作。
  • 不,它是静态的并且相当小。我基本上只是在寻找一种简洁的方法来检索服务集合中的所有类型 T 的实例,理想情况下无需实现任何额外的提供程序。
  • 也许看看 autofac 或 ninject,一些更强大的 DI 库

标签: c# .net-core dependency-injection


【解决方案1】:

注册类,注册接口时,使用委托工厂获取注册类。

public static IServiceCollection AddMyType<T>(this IServiceCollection serviceCollection)
    where T : class, IMyType =>
    serviceCollection
        .AddSingleton<T>();
        .AddSingleton<IMyType>(sp => sp.GetService<T>());

会像这样使用

services.AddMyType<SomeMyType>();
services.AddMyType<OtherMyType>();

为了在这个场景中解析你的服务,为了得到所有注册的IMyType,注入IEnumerable&lt;IMyType&gt;

private readonly IEnumerable<IMyType> instances;

public MyClass(IEnumerable<IMyType> instances) {
    this.instances = instances;

    //...
}

已经注册的具体类型也可以根据需要显式注入

private readonly SomeMyType someType;

public MyClass(SomeMyType someType) {
    this.someType = someType;

    //...
}

【讨论】:

  • 我理解正确吗,在我的代码中会有 2 个单独的实例,但在你的代码中它检索到相同的实例?
  • @AndreasVolkmann 是的。在您的版本中,将有两个单独的实例。在我的中,提供的具体类型只有一个。
猜你喜欢
  • 2019-04-13
  • 1970-01-01
  • 2018-07-13
  • 1970-01-01
  • 2015-10-18
  • 1970-01-01
  • 2020-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多