C# .NET核心依赖项注入-解析接口的实现和IEnumerable

C# .NET核心依赖项注入-解析接口的实现和IEnumerable,c#,.net-core,dependency-injection,C#,.net Core,Dependency Injection,我有一个接口IMyType,有几个实现SomeMyType,OtherMyType 我想使用两种具体类型,以及实现IMyType接口的所有类型的IEnumerable 这些可能是服务中的声明 私有只读IEnumerable实例; 私有只读SomeMyType someType; 私有只读OtherMyType otherType; 实现此功能的一种方法是使用以下扩展: 公共静态IServiceCollection AddMyType(此IServiceCollection服务集合) 其中T:c

我有一个接口
IMyType
,有几个实现
SomeMyType
OtherMyType

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

这些可能是服务中的声明

私有只读IEnumerable实例;
私有只读SomeMyType someType;
私有只读OtherMyType otherType;
实现此功能的一种方法是使用以下扩展:

公共静态IServiceCollection AddMyType(此IServiceCollection服务集合)
其中T:class,IMyType=>
服务集合
.AddSingleton(typeof(IMyType),typeof(T))
.AddSingleton(类型(T));
这为具体类型和接口都添加了一个单例

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


还有其他方法可以改进解决方案吗?我在想,如果这将创建两个T实例,或者如果框架试图用第一个T解析第二个单例。

注册类,并且在注册接口时,使用委托工厂来获取注册的类

public static IServiceCollection AddMyType<T>(this IServiceCollection serviceCollection)
    where T : class, IMyType =>
    serviceCollection
        .AddSingleton<T>();
        .AddSingleton<IMyType>(sp => sp.GetService<T>());
也已注册的具体类型也可以根据需要显式注入

private readonly SomeMyType someType;

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

    //...
}

你到底想达到什么目的?让我们假设您的IEnumerable是一个列表。当您想“注入”您的
list
时,您希望列表中出现什么?我希望
IMyType
的所有实现都在列表中。我想对所有这些文件运行一个方法,我不关心它们的类型。我还想在特定的类型上运行特定的方法。我假设您的列表经常变化或者非常大?否则,您可以创建一个专门的类/服务来实际提供这个列表,这个提供者类本身具有所有可能的实现(SomeMyType、OtherMyType)的依赖性,并负责创建列表。不,它是静态的,而且相当小。我基本上只是在寻找一种检索服务集合中T类型的所有实例的简洁方法,理想情况下不必实现任何其他提供程序。也许可以看看autofac或ninject,一些我正确理解的更强大的DI libsDo,在我的代码中会有两个独立的实例,但在你的代码中它检索到的是同一个实例?@AndreasVolkmann是的。在您的版本中,将有两个单独的实例。在矿山中,所提供的混凝土类型只有一种。
private readonly IEnumerable<IMyType> instances;

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

    //...
}
private readonly SomeMyType someType;

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

    //...
}