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"));