• Autofac官方文档翻译--一、注册组件--2传递注册参数


    官方文档:http://docs.autofac.org/en/latest/register/parameters.html

    二、Autofac 传递注册参数

    当你注册组件时能够提供一组参数,可以在解析基于组件的服务时使用。(如果你宁愿在解析时提供参数,你可以这样做)。

    1、有效的参数类型(Available Parameter Types)

    Autofac提供数个不同的参数匹配策略:
    • NamedParameter - 通过名称匹配目标参数
    • TypedParameter - 通过类型匹配目标参数(需要精确匹配类型)
    • ResolvedParameter - 灵活的参数匹配
    NamedParameter 和TypedParameter 提供唯一不变的值
    ResolvedParameter 可以作为从容器提供动态检索值的一种方法,如通过名称解析服务。

    2、反射组件参数(Parameters with Reflection Components

    当注册反射组件时,该类型的构造函数可能需要一个参数,此参数不能从容器解析,你需要使用一个参数在注册的时候提供这个值。
    
    
    复制代码
    public class ConfigReader : IConfigReader
    {
      public ConfigReader(string configSectionName)
      {
        // 存储配置的节点名称
      }
    
      // ...读取基于节点名称的配置
    }
    复制代码
    你可以使用lambda表达式来注册:
    
    
    builder.Register(c => new ConfigReader("sectionName")).As<IConfigReader>();
    或者你可以在反射组件注册时传入一个参数:
    复制代码
    // 使用一个命名参数:
    builder.RegisterType<ConfigReader>()
           .As<IConfigReader>()
           .WithParameter("configSectionName", "sectionName");
    
    // 使用一个类型参数:
    builder.RegisterType<ConfigReader>()
           .As<IConfigReader>()
           .WithParameter(new TypedParameter(typeof(string), "sectionName"));
    
    // 使用一个解析参数:
    builder.RegisterType<ConfigReader>()
           .As<IConfigReader>()
           .WithParameter(
             new ResolvedParameter(
               (pi, ctx) => pi.ParameterType == typeof(string) && pi.Name == "configSectionName",
               (pi, ctx) => "sectionName"));
    复制代码

    3、Lambda表达式组件参数(Parameters with Lambda Expression Components

    使用表达式组件注册,不是在注册时传入参数,你可以在服务解析时传入参数。
    在组件注册表达式中,你可以通过改变委托签名使用传入参数进行注册,代替仅仅接收一个IComponentContext参数,一个IComponentContext 和 IEnumerable<Parameter>参数:
    
    
    // 使用两个参数来注册委托
    // c = The current IComponentContext to dynamically resolve dependencies
    // p = An IEnumerable<Parameter> with the incoming parameter set
    builder.Register((c, p) =>
                     new ConfigReader(p.Named<string>("configSectionName")))
           .As<IConfigReader>();

     当你解析参数时,你的lambda将使用这些参数来传入值:

    var reader = scope.Resolve<IConfigReader>(new NamedParameter("configSectionName", "sectionName"));
     
     
  • 相关阅读:
    vue 中input的输入限制
    PC端百度地理围栏、绘制工具以及判断当前坐标是否再围栏中
    js判断鼠标点击的是哪个键
    vue过滤器的使用
    3.Mybatis的配置解析
    2.MyBatis的CRUD操作
    4.JVM类加载器深入解析及重要特性剖析
    3.JVM的接口初始化规则与类加载器准备阶段和初始化阶段的重要意义分析
    2.JVM的类加载器
    1.JVM如何学习
  • 原文地址:https://www.cnblogs.com/nimorl/p/12626467.html
Copyright © 2020-2023  润新知