演示通过ServiceProvider得到一个包含多个服务实例的集合。

  1. 定义了一个服务接口IFoobar
  2. 添加服务接口的两个实现类Foo和Bar
  3. 将Foo和Bar的ServiceDescriptor添加到ServiceCollection中
  4. 这时ServiceDescriptor对象的ServiceType属性均为IFoobar。
class Program
{
    static void Main(string[] args)
    {
        IServiceCollection serviceCollection = new ServiceCollection()
            .AddSingleton<IFoobar, Foo>()
            .AddSingleton<IFoobar, Bar>();

        IServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();
        Console.WriteLine("serviceProvider.GetService(): {0}", serviceProvider.GetService<IFoobar>());

        IEnumerable<IFoobar> services = serviceProvider.GetServices<IFoobar>();

        Console.WriteLine("serviceProvider.GetServices():");
        foreach (IFoobar foobar in services)
        {
            Console.WriteLine("{0}",  foobar);
        }
        Console.ReadKey();
    }
}
public interface IFoobar { }
public class Foo : IFoobar { }
public class Bar : IFoobar { }
代码实现

该程序运行后将会在控制台上生成如下的输出结果:

  • 先调用ServiceProvider的GetService<T>方法以确定针对服务接口IFoobar得到的实例。
  • 再调用ServiceProvider的GetServices<T>方法获取一组针对服务接口IFoobar的服务实例。
serviceProvider.GetService(): AspnetCore02.Bar
serviceProvider.GetServices():
AspnetCore02.Foo
AspnetCore02.Bar