【发布时间】:2020-02-05 09:34:12
【问题描述】:
我有一个接口IMyType,有几个实现SomeMyType,OtherMyType。
我想同时使用具体类型,以及实现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<IMyType>时,您希望列表中出现什么? -
我希望
IMyType的所有实现都在列表中。我想在所有这些上运行一个方法,我不在乎它们有什么类型。我还想针对特定类型运行特定方法。 -
我假设您的列表经常更改或非常大?否则,您可以创建一个实际提供此列表的专用类/服务,并且此提供程序类本身具有所有可能的实现(SomeMyType、OtherMyType)作为依赖项并完成创建列表的工作。
-
不,它是静态的并且相当小。我基本上只是在寻找一种简洁的方法来检索服务集合中的所有类型 T 的实例,理想情况下无需实现任何额外的提供程序。
-
也许看看 autofac 或 ninject,一些更强大的 DI 库
标签: c# .net-core dependency-injection