Autofac官方文档(八)【解析服务之传递参数来解析】
来源:互联网 发布:广西干部网络培训平台 编辑:程序博客网 时间:2024/06/05 00:13
当需要解析服务时,您可能会发现需要将参数传递给解析。(如果您在注册时知道这些值,则可以在注册时提供这些值。)
Resolve()方法使用可变长度参数列表接受注册时可用的相同参数类型。或者,委托工厂和Func 隐式关系类型也允许在解析过程中传递参数。
可用的参数类型
Autofac
提供了几种不同的参数匹配策略:
NamedParameter
- 按名称匹配目标参数TypedParameter
- 按类型匹配目标参数(需要完全类型匹配)ResolvedParameter
- 灵活的参数匹配
NamedParameter
和TypedParameter
只能提供常量值。
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>隐式关系类型可以提供自动生成的工厂函数。
- Autofac官方文档(八)【解析服务之传递参数来解析】
- Autofac中文文档--二、解析服务--1解析参数传递
- Autofac官方文档(七)【解析服务】
- Autofac官方文档(九)【解析服务之隐式关系类型】
- Autofac官方文档(四)【注册组件之将参数传递给注册者】
- Autofac中文文档--二、解析服务--2隐式关系类型
- Autofac中文文档--一、注册组件--2传递注册参数
- Mininet 官方文档解析
- Autofac官方文档(三)【注册组件之注册概念】
- Autofac官方文档(六)【注册组件之程序集扫描】
- Autofac官方文档(二十一)【应用集成之OWIN】
- Autofac官方文档(二十二)【应用集成之MVC】
- Autofac官方文档(二十三)【应用集成之Web API】
- Autofac官方文档(二十四)【应用集成之Web Forms】
- Autofac官方文档(一)【开始】
- Autofac官方文档(二)【新版本】
- Autofac官方文档(十四)【销毁】
- Autofac官方文档(十七)【配置】
- 可拖拽和带二维码的登录窗口设计效果 -- 一天一个篇文章
- 如何把坐标作为hashmap的key
- Android高效加载大图、多图解决方案,有效避免程序OOM
- Autofac官方文档(七)【解析服务】
- 2017湖湘杯pwn200的wp
- Autofac官方文档(八)【解析服务之传递参数来解析】
- Spring入门-----HelloWorld
- Glide和Picasso对比
- xilinx--IOB(2)
- Autofac官方文档(九)【解析服务之隐式关系类型】
- oracle基础-->delete和truncate的区别
- Ubuntu中SonarQube6.7 启动报错:can not run elasticsearch as root
- 云服务器构建LNMP环境遇到的一些问题及解决方法
- Autofac官方文档(十)【控制作用域和生命周期】