• 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"));
  • 相关阅读:
    【支付宝支付】手机网页内 支付宝支付实现过程
    【微信支付】微信端的手机网页支付 开发流程
    【Linux】Linux下 环境变量/etc/profile、/etc/bashrc、~/.bashrc的区别【转】
    SLF4J 和 Logback 在 Maven 项目中的使用方法
    打造Spring Cloud构建微服务架构的最全资料
    WebApi安全性 使用TOKEN+签名验证
    <meta http-equiv = "X-UA-Compatible" content = "IE=edge,chrome=1" />的意义
    request.getParameter(“参数名”) 中文乱码解决方法
    Mysql的timestamp类型,自动记录数据的更新时间
    根据身份证号,取得行政区划的Javascript实现
  • 原文地址:https://www.cnblogs.com/chiyueqi/p/autofac_RegisterParameters.html
Copyright © 2020-2023  润新知