Autofac中文文档--一、注册组件--2传递注册参数

来源:互联网 发布:犀牛软件建模 编辑:程序博客网 时间:2024/05/17 05:04

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

二、传递注册参数

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

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 setbuilder.Register((c, p) =>                 new ConfigReader(p.Named<string>("configSectionName")))       .As<IConfigReader>();

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

var reader = scope.Resolve<IConfigReader>(new NamedParameter("configSectionName", "sectionName"));
0 0
原创粉丝点击