当你注册组件时,可以为组件服务传入一系列参数,用于服务解析时使用。

可使用的参数类型 Available Parameter Types

Autofac提供了集中参数匹配类别:

  • NamedParameter - 直接通过名称匹配目标参数
  • TypedParameter - 通过类型来匹配目标参数
  • ResolvedParameter - 灵活的参数匹配

NamedParameter 和 TypedParameter只支持常量。

ResolvedParameter 能够使用从容器中动态解析的值作为参数, 例如通过名字解析出的服务。

反射组件的参数 Parameters with Reflection Components

当你注册基于反射的组件时,类型构造函数可能要求一些无法从容器中解析的参数。你可以通过直接提供此参数来完成组件注册。

假设你有一个配置阅读器(configuration reader),同时需要为它传入配置块命名(configuration section name):

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表达式组件的参数 Parameters with Lambda Expression Components

使用Lambda表达式,而不是在组件注册时直接传入参数能够保证动态参数在服务被调用时被传入。

在组件注册表达式中,你可以通过改变用语注册组件的委托签名来使用传入的参数。可以使用具有一个IComponentContext参数和一个IEnumerable<Parameter>参数的委托来替代只使用单个IComponentContext参数的委托。

// 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表达式将会使用传入的参数:

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

.NET手记-Autofac进阶(传递注册参数 Passing Parameters to Register)的更多相关文章

  1. Autofac官方文档翻译--一、注册组件--2传递注册参数

    官方文档:http://docs.autofac.org/en/latest/register/parameters.html 二.Autofac 传递注册参数 当你注册组件时能够提供一组参数,可以在 ...

  2. .NET手记-Autofac进阶(注册的概念 Registering Concepts)

    通过创建ContainerBuilder并配置暴露的service(接口或者类型)来使用Autofac注册我们的组件. 组件(Components) 可以通过反射, 对象实例,或者lambda表达式来 ...

  3. linux中probe函数中传递的参数来源(上)

    点击打开链接 上一篇中,我们追踪了probe函数在何时调用,知道了满足什么条件会调用probe函数,但probe函数中传递的参数我们并不知道在何时定义,到底是谁定义的,反正不是我们在驱动中定义的(当然 ...

  4. python函数进阶(函数参数、返回值、递归函数)

    函数进阶 目标 函数参数和返回值的作用 函数的返回值 进阶 函数的参数 进阶 递归函数 01. 函数参数和返回值的作用 函数根据 有没有参数 以及 有没有返回值,可以 相互组合,一共有 4 种 组合形 ...

  5. Python进阶-函数默认参数

    Python进阶-函数默认参数 写在前面 如非特别说明,下文均基于Python3 一.默认参数 python为了简化函数的调用,提供了默认参数机制: def pow(x, n = 2): r = 1 ...

  6. Python进阶(二)----函数参数,作用域

    Python进阶(二)----函数参数,作用域 一丶形参角度:*args,动态位置传参,**kwargs,动态关键字传参 *args: ​ 动态位置参数. 在函数定义时, * 将实参角度的位置参数聚合 ...

  7. iOS NSNotification传递带参数的通知

    普通的通知使用 注册观察者 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getNotificat ...

  8. Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数

    上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...

  9. java方法强制传递引用参数(做为返回值),改变被传递参数值。

    Java传递参数分为2种: 值类型,Java里面也叫简单类型,这种参数类型的传递的是它的副本拷贝: 引用类型,传递的是对象引用地址,如果在方法内改变该参数对象属性即是对原引用对象的改变:如果不想这样传 ...

随机推荐

  1. IntelliJ IDEA——SVN的配置及使用

    服务端:VisualSVN-Server-3.9.1-x64 下载地址:https://www.visualsvn.com/server/download/ TortoiseSVN 安装 下载地址:h ...

  2. 微信小程序星星评价

    https://www.jianshu.com/p/4d7359dfa040

  3. 106. Construct Binary Tree from Inorder and Postorder Traversal根据后中序数组恢复出原来的树

    [抄题]: Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assum ...

  4. viewstate?

    用于存放数据,可永久保存,存放在页面的隐藏控件里      支持string,integer,array,boolean,ArrayList,hashtable类型,使用viewstate会增加页面h ...

  5. canvas(五)createPattern

    /** * Created by xianrongbin on 2017/3/9. * 图片填充 */ var dom = document.getElementById('clock'), ctx ...

  6. 48-Python 安装pyautogui失败解决办法

    转载自:https://www.cnblogs.com/SH170706/p/9809830.html Python 安装pyautogui 在Python中使用PyAutoGui模拟键盘和鼠标操作 ...

  7. MySQL开发——【数据的基本操作】

    增加数据 基本语法: insert into 数据表 [字段名称1,字段名称2..] values (数据1,数据2...); 特别注意:针对数据类型整型.浮点型数据可以不加单引或双引号,但是如果字段 ...

  8. springboot中使用ContextLoaderListener.getCurrentWebApplicationContext();获取WebApplicationContext为空问题

    WebApplicationContext applicationContext = ContextLoaderListener.getCurrentWebApplicationContext(); ...

  9. osg探究补充:Node::accept(NodeVisitor& nv)及NodeVisitor简介

    前言 在前几节中,我自己觉得讲的比较粗糙,因为实在是时间上不是很充足,今天我想弥补一下,希望不是亡羊补牢.我们在osgViewer::Viewer::eventTraversal()函数中经常看到这么 ...

  10. c++模板笔记

    使用vc2015进行C++ 模板的学习实验和笔记 用简单示例学习了解STL template大部头理论书 讲解各种规则和各种规则例外的解决办法 集中精力在20%的规则中的阴暗角落而不是80%实践中要注 ...