猿教程 Logo

Autofac教程:注册时传参

当您注册组件时,您可以提供一组可在基于该组件的服务解析期间使用的参数。 


可用参数类型

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

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

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

  • ResolvedParameter - 灵活的参数匹配

NamedParameter和TypedParameter只能提供常量值。

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


带有反射组件的参数

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

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

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

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

您可以使用lambda表达式组件:

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

或者您可以将参数传递给反射组件注册:

// Using a NAMED parameter:
builder.RegisterType<ConfigReader>()
       .As<IConfigReader>()
       .WithParameter("configSectionName", "sectionName");

// Using a TYPED parameter:
builder.RegisterType<ConfigReader>()
       .As<IConfigReader>()
       .WithParameter(new TypedParameter(typeof(string), "sectionName"));

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

具有Lambda表达式组件的参数¶

使用lambda表达式组件注册,而不是在注册时传递参数值,使您能够在服务解析时间传递该值。 

在组件注册表达式中,您可以通过更改用于注册的代理签名来使用传入参数。 而不是仅仅使用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>();

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

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


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