.NET Core依赖注入 - >获取接口的所有实现

时间:2016-09-19 07:30:32

标签: .net dependency-injection asp.net-core

我有一个名为IRule的接口和多个实现此接口的类。我想使用.NET Core依赖注入Container来加载IRule的所有实现,所以所有实现的规则。

不幸的是我无法完成这项工作。我知道我可以将IEnumerable<IRule>注入控制器的控制器中,但我不知道如何在Startup.cs中注册此设置

2 个答案:

答案 0 :(得分:12)

这只是逐个注册所有IRule实现的问题; MS.Ext.DI库可以将其解析为IEnumerable<T>

services.AddTransient<IRule, Rule1>();
services.AddTransient<IRule, Rule2>();
services.AddTransient<IRule, Rule3>();
services.AddTransient<IRule, Rule4>();

答案 1 :(得分:0)

对于正在寻找答案的其他人。您还可以检查程序集并注册实现特定接口的所有类:

// Get all implementations of IRule and add them to the DI
var rules = typeof(Program).Assembly.GetTypes()
    .Where(x => !x.IsAbstract && x.IsClass && x.GetInterface(nameof(IRule)) == typeof(IRule));

foreach (var rule in rules)
{
    services.Add(new ServiceDescriptor(typeof(IRule), rule, ServiceLifetime.Transient));
    // Replace Transient with whatever lifetime you need
}

这还将为作为依赖注入一部分的每个类提供一个 IEnumerable<IRule>。此解决方案的优点是您无需将每条规则都添加到依赖项注入中。您只需将 IRule 的新实现添加到您的项目中,它就会自动注册。