猿教程 Logo

Autofac教程:解析时传参

在解析服务的时候,您可能会发现需要将参数传递给Autofac。 (如果您在注册时知道值,则可以在注册中提供它们。)

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


可用参数类型

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

  • NamedParameter - 按名称匹配目标参数

  • TypedParameter - 按类型匹配目标参数(需要精确类型匹配)

  • ResolvedParameter - 灵活的参数匹配

NamedParameter和TypedParameter只能提供常量值。

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


带反射元件的参数

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

假设您有一个配置读取器,需要传递一个配置部分名称:

public class ConfigReader : IConfigReader
{
  public ConfigReader(string configSectionName)
  {
    // Store config section name
  }

  // ...read configuration based on the section name.
}

您可以将参数传递给Resolve()调用,如下所示:

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

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

如果您有多个参数,只需通过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参数,而是接收一个IComponentContext和一个IEnumerable <Parameter>:

相关实例:

// Use TWO parameters to the registration delegate:
// 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>();

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

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

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

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

  • 委托工厂允许您定义工厂委托方法。

  • Func <T>隐式关系类型可以提供自动生成的工厂功能。


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/Autofac/resolve-parameters.html