上篇重点讲了netcore依赖注入系统是如何解析服务的
再回顾一下
ServiceProvider类继承IServiceProvider接口,实现IServiceProvider接口的GetService方法
ServiceProvider又是根据ServiceProviderOptions类的Mode属性创建对应的IServiceProviderEngine实例(真正的解析服务)
IServiceProviderEngine的实现有DynamicServiceProviderEngine、ExpressionsServiceProviderEngine、ILEmitServiceProviderEngine、RuntimeServiceProviderEngine
上面的实现类都继承自ServiceProviderEngine抽象类
ServiceProviderEngine抽象类的CallSiteFactory对我们注册的服务IEnumerable<ServiceDescriptor>进行转换,转换成对应的ServiceCallSite对象。
ServiceProviderEngine抽象类的属性RuntimeResolver(CallSiteRuntimeResolver类型)也能解析服务。
DynamicServiceProviderEngine、ExpressionsServiceProviderEngine、ILEmitServiceProviderEngine、RuntimeServiceProviderEngine实现了ServiceProviderEngine抽象类的RealizeService方法解析服务
总结:ServiceProvider是服务的核心。
IServiceCollection的扩展方法:
/// <summary> /// Extension methods for building a <see cref="ServiceProvider"/> from an <see cref="IServiceCollection"/>. /// </summary> public static class ServiceCollectionContainerBuilderExtensions { /// <summary> /// Creates a <see cref="ServiceProvider"/> containing services from the provided <see cref="IServiceCollection"/>. /// </summary> /// <param name="services">The <see cref="IServiceCollection"/> containing service descriptors.</param> /// <returns>The <see cref="ServiceProvider"/>.</returns> public static ServiceProvider BuildServiceProvider(this IServiceCollection services) { return BuildServiceProvider(services, ServiceProviderOptions.Default); } /// <summary> /// Creates a <see cref="ServiceProvider"/> containing services from the provided <see cref="IServiceCollection"/> /// optionally enabling scope validation. /// </summary> /// <param name="services">The <see cref="IServiceCollection"/> containing service descriptors.</param> /// <param name="validateScopes"> /// <c>true</c> to perform check verifying that scoped services never gets resolved from root provider; otherwise <c>false</c>. /// </param> /// <returns>The <see cref="ServiceProvider"/>.</returns> public static ServiceProvider BuildServiceProvider(this IServiceCollection services, bool validateScopes) { return services.BuildServiceProvider(new ServiceProviderOptions { ValidateScopes = validateScopes }); } /// <summary> /// Creates a <see cref="ServiceProvider"/> containing services from the provided <see cref="IServiceCollection"/> /// optionally enabling scope validation. /// </summary> /// <param name="services">The <see cref="IServiceCollection"/> containing service descriptors.</param> /// <param name="options"> /// Configures various service provider behaviors. /// </param> /// <returns>The <see cref="ServiceProvider"/>.</returns> public static ServiceProvider BuildServiceProvider(this IServiceCollection services, ServiceProviderOptions options) { if (services == null) { throw new ArgumentNullException(nameof(services)); } if (options == null) { throw new ArgumentNullException(nameof(options)); } return new ServiceProvider(services, options); } }
BuildServiceProvider方法根据注册的服务创建ServiceProvider对象,此时我们可以从ServiceProvider获取到我们注册的服务了
我们看下简单的使用场景
public interface IUserService { string GetName(); } public class UserService : IUserService { public string GetName() { return "test"; } } class Program { static void Main(string[] args) { var services = new ServiceCollection(); services.AddTransient<IUserService, UserService>(); var provider = services.BuildServiceProvider(); var userService = provider.GetService<IUserService>(); var result = userService.GetName(); Console.WriteLine(result); Console.Read(); } }