官方文档:http://docs.autofac.org/en/latest/register/parameters.html
当你注册组件时能够提供一组参数, 可以在解析基于组件的服务时使用。(如果你宁愿在解析时提供参数, 你可以这样做)。
- Autofac提供数个不同的参数匹配策略:
- NamedParameter 和TypedParameter 提供唯一不变的值
- ResolvedParameter 可以作为从容器提供动态检索值的一种方法,如通过名称解析服务。
- 当注册反射组件时,该类型的构造函数可能需要一个参数,此参数不能从容器解析,你需要使用一个参数在注册的时候提供这个值。
- public class ConfigReader: IConfigReader {
- public ConfigReader(string configSectionName) {
- // 存储配置的节点名称
- }
- // ...读取基于节点名称的配置
- }
- 你可以使用lambda表达式来注册:
- builder.Register(c = >new ConfigReader("sectionName")).As();
- 或者你可以在反射组件注册时传入一个参数:
- // 使用一个命名参数:
- builder.RegisterType().As().WithParameter("configSectionName", "sectionName");
- // 使用一个类型参数:
- builder.RegisterType().As().WithParameter(new TypedParameter(typeof(string), "sectionName"));
- // 使用一个解析参数:
- builder.RegisterType().As().WithParameter(new ResolvedParameter((pi, ctx) = >pi.ParameterType == typeof(string) && pi.Name == "configSectionName", (pi, ctx) = >"sectionName"));
- 使用表达式组件注册,不是在注册时传入参数,你可以在服务解析时传入参数。
- 在组件注册表达式中,你可以通过改变委托签名使用传入参数进行注册,代替仅仅接收一个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();
当你解析参数时,你的 lambda 将使用这些参数来传入值:
- var reader = scope.Resolve(new NamedParameter("configSectionName", "sectionName"));
来源: http://www.cnblogs.com/chiyueqi/p/autofac_RegisterParameters.html