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();
    
            }
        }
  • 相关阅读:
    点击对应不同name的button,显示不同name的弹窗(弹窗功能)
    点击添加本地图片的前端效果制作
    巧用margin/padding的百分比值实现高度自适应(多用于占位,避免闪烁)
    移动端取消touch高亮效果
    手机网站的几点注意
    图片自动切换+链接
    使用DOM的方法获取所有li元素,然后使用jQuery()构造函数把它封装为jQuery对象
    使用jQuery匹配文档中所有的li元素,返回一个jQuery对象,然后通过数组下标的方式读取jQuery集合中第1个DOM元素,此时返回的是DOM对象,然后调用DOM属性innerHTML,读取该元素 包含的文本信息
    利用jQuery扩展接口为jQuery框架定义了两个自定义函数,然后调用这两个函数
    jQuery链式语法演示
  • 原文地址:https://www.cnblogs.com/lanpingwang/p/12539740.html
Copyright © 2011-2022 走看看