Autofac官方文档(四)【注册组件之将参数传递给注册者】

在注册组件时,您可以提供一组参数,这些参数可以在解决基于该组件的服务时使用。(如果您希望在解析时提供参数,则可以改为执行此操作。)

可用的参数类型

Autofac提供了几种不同的参数匹配策略:

  • NamedParameter - 按名称匹配目标参数
  • TypedParameter - 按类型匹配目标参数(需要完全类型匹配)
  • ResolvedParameter - 灵活的参数匹配

NamedParameterTypedParameter只能提供常量值。

ResolvedParameter可以用作提供从容器动态检索的值的方法,例如, 通过名称解析服务。

参数与反射组件

当您注册基于反射的组件时,该类型的构造函数可能需要一个无法从容器中解析的参数。 您可以在注册中使用参数来提供该值。

假设你有一个配置阅读器需要一个配置部分名称传入:

public class ConfigReader : IConfigReader
{
  public ConfigReader(string configSectionName)
  {
    //存储配置节名称
  }

  // ...根据段名称读取配置。
}

你可以使用一个lambda表达式组件:

builder.Register(c => new ConfigReader("sectionName")).As<IConfigReader>();

或者你可以传递一个参数给反射组件注册:

//使用NAMED参数:
builder.RegisterType<ConfigReader>()
       .As<IConfigReader>()
       .WithParameter("configSectionName", "sectionName");

//使用TYPED参数:
builder.RegisterType<ConfigReader>()
       .As<IConfigReader>()
       .WithParameter(new TypedParameter(typeof(string), "sectionName"));

//使用RESOLVED参数:
builder.RegisterType<ConfigReader>()
       .As<IConfigReader>()
       .WithParameter(
         new ResolvedParameter(
           (pi, ctx) => pi.ParameterType == typeof(string) && pi.Name == "configSectionName",
           (pi, ctx) => "sectionName"));

包含Lambda表达式组件的参数

使用lambda表达式组件注册,而不是在注册时传递参数值,您可以在服务解析时启用该值。 (阅读更多关于解决参数。)

在组件注册表达式中,可以通过更改用于注册的委托签名来使用传入参数。 接受一个IComponentContext和一个IEnumerable<Parameter>参数,而不仅仅是接受一个IComponentContext参数:

// 使用TWO参数注册代理:
// 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>();

When resolving with parameters, your lambda will use the parameters passed in:
解析参数时,lambda将使用传入的参数:

var reader = scope.Resolve<IConfigReader>(new NamedParameter("configSectionName", "sectionName"));
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值