zoukankan      html  css  js  c++  java
  • 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"));
     
     
  • 相关阅读:
    垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
    自考感悟,话谈备忘录模式
    [每日一题] OCP1z0-047 :2013-07-26 alter table set unused之后各种情况处理
    Java实现 蓝桥杯 算法提高 p1001
    Java实现 蓝桥杯 算法提高 拿糖果
    Java实现 蓝桥杯 算法提高 拿糖果
    Java实现 蓝桥杯 算法提高 求arccos值
    Java实现 蓝桥杯 算法提高 求arccos值
    Java实现 蓝桥杯 算法提高 因式分解
    Java实现 蓝桥杯 算法提高 因式分解
  • 原文地址:https://www.cnblogs.com/nimorl/p/12626467.html
Copyright © 2011-2022 走看看