我有一个名为IRule的接口和多个实现此接口的类。我想使用.NET Core依赖注入Container来加载IRule的所有实现,所以所有实现的规则。
不幸的是我无法完成这项工作。我知道我可以将IEnumerable<IRule>
注入控制器的控制器中,但我不知道如何在Startup.cs中注册此设置
答案 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
的新实现添加到您的项目中,它就会自动注册。