.Net Core DI依赖注入:一个接口注入多个实现类(转载)
方式一、默认就可以注入多个实现类
例如接口IShow,注入ShowA和ShowB两个实现类:
services.AddTransient<IShow, ShowA>();
services.AddTransient<IShow, ShowB>();
获取的时候默认是获取到最后一个,如下所示:
可以使用"IEnumerable<IShow> showList" 的方式来获取所有注入的实现类,如下所示:
还可以用IServiceProvider接口的扩展方法"IEnumerable<T> GetServices<T>(this IServiceProvider provider)",来获取所有注入的实现类:
IServiceCollection services = new ServiceCollection(); services.AddTransient<IShow, ShowA>(); services.AddTransient<IShow, ShowB>(); using (ServiceProvider serviceProvider = services.BuildServiceProvider()) { IEnumerable<IShow> shows = serviceProvider.GetServices<IShow>(); foreach (var show in shows) { show.Show(); } }
结果如下:
方式二、使用注入方法”AddTransient<TService>(this IServiceCollection services, Func<IServiceProvider, TService> implementationFactory)“ 来实现
还是接口IShow,注入ShowA和ShowB两个实现类:
services.AddTransient<ShowA>(); services.AddTransient<ShowB>(); services.AddTransient(serviceProvider => { Func<Type, IShow> accesor = key => { if (key == typeof(ShowA)) return serviceProvider.GetService<ShowA>(); else if (key == typeof(ShowB)) return serviceProvider.GetService<ShowB>(); else throw new ArgumentException($"不支持的DI Key: {key}"); }; return accesor; });
获取方式如下所示: