zoukankan      html  css  js  c++  java
  • netcore3.0 IServiceCollection 依赖注入系统(三)

    上篇重点讲了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();
    
            }
        }
  • 相关阅读:
    Representation Data in OpenCascade BRep
    Render OpenCascade Geometry Surfaces in OpenSceneGraph
    Render OpenCascade Geometry Curves in OpenSceneGraph
    OpenCascade Shape Representation in OpenSceneGraph
    Geometry Surface of OpenCascade BRep
    Geometry Curve of OpenCascade BRep
    Tyvj2017清北冬令营入学测试
    Spfa算法模板
    洛谷1016 旅行家的预算
    洛谷1290 欧几里得的游戏
  • 原文地址:https://www.cnblogs.com/lanpingwang/p/12539740.html
Copyright © 2011-2022 走看看