在.NET中我们可以定义接口的多种实现,可以多次注入,但是在使用时候会发现它只会默认获取最后一次注入的实现类。这个自然是没有什么问题,但是当我们想要获取到其它实现时可以利用以下方法来实现:
例如接口
public interface IDemoService
{
void Run();
}
(1)通过总接口IServiceProvider 来获取
public void Resolve(IServiceProvider provider)
{
foreach (var sv in provider.GetServices<IDemoService>())
{
//to do
}
}
(2)通过获取IEnumerable来实现
public void Resolve(IEnumerable<IDemoService> svs)
{
foreach (var sv in svs)
{
//to do
}
}
以上就是全部内容。
用法说明
- 多次注册:services.AddScoped<IDemoService, A>(); services.AddScoped<IDemoService, B>();
- 取单个:注入 IDemoService 只会得到最后注册的实现。
- 取全部:注入 IEnumerable<IDemoService> 可遍历所有实现。
- 或用 IServiceProvider.GetServices<IDemoService>() 按需获取。
典型用途:策略模式(按条件选用实现)、批量处理(遍历所有处理器)。
相关阅读
- .Net Core WPF中使用Autofac 依赖注入
- .NET Core ConfigureServices和Configure区别
- .net 平台下Sqlite 连接串示例|常用格式与密码写法
- .Net Core Razor Pages 的全局过滤器设置