.NET核心依赖项注入->;获取接口的所有实现

.NET核心依赖项注入->;获取接口的所有实现,.net,dependency-injection,asp.net-core,.net,Dependency Injection,Asp.net Core,我有一个名为IRule的接口和多个实现该接口的类。我想使用.NET核心依赖项注入容器来加载IRule的所有实现,从而加载所有实现的规则 不幸的是,我做不到这一点。我知道我可以将一个IEnumerable注入控制器的ctor,但我不知道如何在启动时注册此设置。cs只需逐个注册所有IRule实现;Microsoft.Extensions.DependencyInjection(MS.DI)库可以将其解析为IEnumerable。例如: services.AddTransient<IRule,

我有一个名为IRule的接口和多个实现该接口的类。我想使用.NET核心依赖项注入容器来加载IRule的所有实现,从而加载所有实现的规则


不幸的是,我做不到这一点。我知道我可以将一个
IEnumerable
注入控制器的ctor,但我不知道如何在启动时注册此设置。cs

只需逐个注册所有
IRule
实现;Microsoft.Extensions.DependencyInjection(MS.DI)库可以将其解析为
IEnumerable
。例如:

services.AddTransient<IRule, Rule1>();
services.AddTransient<IRule, Rule2>();
services.AddTransient<IRule, Rule3>();
services.AddTransient<IRule, Rule4>();
services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddTransient();
消费者:

public sealed class Consumer
{
    private readonly IEnumerable<IRule> rules;

    public Consumer(IEnumerable<IRule> rules)
    {
        this.rules = rules;
    }
}
公共密封类消费者
{
私有只读IEnumerable规则;
公共消费者(IEnumerable规则)
{
这个。规则=规则;
}
}

注意:MS.DI支持的唯一集合类型是
IEnumerable

解析IEnumerable是否存在任何性能问题?与十几个类似,注入一个抽象工厂,然后按名称解析单个服务。Thanks@whoever这是一个不可能回答的问题。您必须自己测量这一点,以确定性能特征在您的特定环境中是否正常。量,量,量。@Steven谢谢。我只是再看一眼。事实上,就连我的两个案例也不一样。首先,我循环调用所有实现,因此InjectIEnumerable非常有意义;在另一种情况下,每个调用方只需要一个特定的实现,但只有两个实现,并且init成本可以忽略不计,有点像wash。因此,我决定将抽象内容另存一天^ ^@steven您将如何安排规则的顺序?假设我有规则1,规则2和规则3。如果您想将订单作为规则3、规则1、规则2。也许在另一节中,您希望规则2后跟规则1。我想的一种方法是让一个逗号分隔的列表循环数组,并与规则名匹配,但这似乎有点老套。有什么建议吗?