Autofac官方文档(八)【解析服务之传递参数来解析】

当需要解析服务时,您可能会发现需要将参数传递给解析。(如果您在注册时知道这些值,则可以在注册时提供这些值。)

Resolve()方法使用可变长度参数列表接受注册时可用的相同参数类型。或者,委托工厂和Func 隐式关系类型也允许在解析过程中传递参数。
可用的参数类型

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

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

NamedParameterTypedParameter只能提供常量值。

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

参数与反射组件

在解析基于反射的组件时,该类型的构造函数可能需要一个参数,您需要根据运行时值指定该参数,这在注册时不可用。您可以在Resolve()方法调用中使用参数来提供该值。

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

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

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

你可以像下面这样传递一个参数给Resolve()

var reader = scope.Resolve<ConfigReader>(new NamedParameter("configSectionName", "sectionName"));

与注册时间参数一样,假设Person组件是使用反射注册的,则示例中的NamedParameter将映射到相应的已命名构造函数参数。

如果你有多个参数,只需通过Resolve()方法传递它们:

var service = scope.Resolve<AnotherService>(
                new NamedParameter("id", "service-identifier"),
                new TypedParameter(typeof(Guid), Guid.NewGuid()),
                new ResolvedParameter(
                  (pi, ctx) => pi.ParameterType == typeof(ILog) && pi.Name == "logger",
                  (pi, ctx) => LogManager.GetLogger("service")));

包含Lambda表达式组件的参数

使用lambda表达式组件注册时,您需要在lambda表达式中添加参数处理,因此当Resolve()调用将其传入时,您可以利用它们。

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

// 使用TWO参数注册代理:
// c = 当前的`IComponentContext`来动态解决依赖关系
// p = 具有传入参数集的IEnumerable<Parameter>
builder.Register((c, p) =>
                 new ConfigReader(p.Named<string>("configSectionName")))
       .As<IConfigReader>();

现在,当你解析IConfigReader时,你的lambda将使用传入的参数:

var reader = scope.Resolve<IConfigReader>(new NamedParameter("configSectionName", "sectionName"));

传递参数而不显式调用解析

Autofac支持两种功能,允许您自动生成服务“工厂”,这些服务“工厂”可以采用在解析期间将使用的强类型参数列表。 这是创建需要参数的组件实例的稍微更简洁的方法。

 委托工厂允许您定义工厂委托方法。
 Func<T>隐式关系类型可以提供自动生成的工厂函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值