Autofac 传递解析参数

注册组件公开相应的服务之后,你可以从container构造器和子lifetime scopes 中解析服务。使用Resolve()方法来实现:
var builder = new ContainerBuilder();
builder.RegisterType<MyComponent>().As<IService>();
var container = builder.Build(); using(var scope = container.BeginLifetimeScope())
{
var service = scope.Resolve<IService>();
}
  你会发现在这个例子中,从一个lifetime scope 中解析服务,而不是直接在容器中解析,你也应该这样做。
  然而也有可能从根容器中解析组件,在你的应用中这样做在一些情况下可能导致内存泄露。推荐你总是从一个lifetime scope中解析组件,以尽可能确保服务实例妥善处理和垃圾回收。在本节中你可以阅读到很多关于控制范围和生命周期的知识。
  当解析服务时,Autofac 将自动链接服务的整个依赖层次结构,并且解析全面构建服务所需的任何依赖关系。如果你有循环依赖关系处理不当或缺失必须的依赖,你会得到一个DependencyResolutionException。
  如果你有一个服务,不知道是否被注册了,你可以尝试使用ResolveOptional()或TryResolve()来解决:
// 如果 IService 被注册, 它将被解析;
// 如果没有被注册,将返回null;
var service = scope.ResolveOptional<IService>(); // 如果 IProvider 被注册, provider 变量将获取此值,
// 否则,你可以进行其他操作
//
IProvider provider = null;
if(scope.TryResolve<IProvider>(out provider))
{
// Do something with the resolved provider value.
}
ResolveOptional()和TryResolve()围绕一个被注册的特定服务的条件本质。如果服务被注册,将尝试解析,如果解析失败,你将得到一个DependencyResolutionExceptionResolve()异常。如果你需要对一个服务进行条件判断,此条件建立在此服务是否能被成功解析,用一个try/catch块包裹Resolve()之后调用。

1、传递解析参数

当解析服务时,你会发现需要为解析传入参数。
Resolve()方法使用可变长度的参数列表,匹配注册时相同的参数类型。另外,委托工厂和Func<T>隐式关系类型也允许在解析期间传递参数。

1.1可用参数类型

Autofac 提供不同的参数匹配策略:
  • NamedParameter - 通过名称匹配目标参数
  • TypedParameter - 通过类型匹配目标参数
  • ResolvedParameter - 灵活的参数匹配
NamedParameter 和TypedParameter 只能提供固定值。
ResolvedParameter 可为一个从容器提供动态检索值,例如通过一个名称解析服务。

1.2反射组件参数

有当你解析基于反射的组件时,该类型的构造函数可能需要你在运行时指定一个参数值,不适合在注册时指定该值。你需要使用一个参数在Resolve()方法调用时提供这个值。
例如,你有一个配置读取类 ,需要传入一个配置节的名称:
public class ConfigReader : IConfigReader
{
public ConfigReader(string configSectionName)
{
// Store config section name
} // ...read configuration based on the section name.
}
你可以像这样,在解析时传递一个参数:
var reader = scope.Resolve<ConfigReader>(new NamedParameter("configSectionName", "sectionName"));
作为注册时参数,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")));

1.3Lambda表达式组件参数

使用lambda表达式组件注册,你需要在你的lambda表达式中添加参数处理,所以当调用Resolve()传递它们时,你可以利用它们。

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

// 注册委托使用两个参数:
// 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"));

1.4传递参数不调用Resolve

全Autofac 支持两种特性,允许你自动生成服务工厂,在解析时使用强类型参数列表。对于创建需要参数的组件实例,这是非常清洁的方式。

Autofac官方文档翻译--二、解析服务--1解析参数传递的更多相关文章

  1. Autofac官方文档翻译--二、解析服务--2隐式关系类型

    Autofac 隐式关系类型 Autofac 支持自动解析特定类型,隐式支持组件与服务间的特殊关系.要充分利用这些关系,只需正常注册你的组件,但是在使用服务的组件或调用Resolve()进行类型解析时 ...

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

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

  3. Autofac官方文档翻译--一、注册组件--1注册概念

    官方文档:http://docs.autofac.org/en/latest/register/registration.html 一.注册概念 使用Autofac 注册组件,通过创建一个Contai ...

  4. Orchard官方文档翻译(二) 安装 Orchard

    原文地址:http://docs.orchardproject.net/Documentation/Installing-Orchard 想要查看文档目录请用力点击这里 最近想要学习了解orchard ...

  5. Autofac官方文档翻译--一、注册组件--4组件扫描

    官方文档:http://docs.autofac.org/en/latest/register/scanning.html Autofac 组件扫描 在程序集中Autofac 可以使用约定来找到并注册 ...

  6. Autofac官方文档翻译--一、注册组件--3属性和方法注入

    官方文档:http://docs.autofac.org/en/latest/register/prop-method-injection.html Autofac 属性和方法注入 虽然构造函数参数注 ...

  7. Log4j官方文档翻译(二、架构设计)

    log4j遵循层次化架构,每个层都有不同的对象来执行不同的任务.这种层次话的结构灵活设计.易于未来的扩展. log4j框架中有两种对象: 核心对象:框架的支撑对象,是框架必不可少的组成部分. 支撑对象 ...

  8. Android官方文档翻译 二 1.Building Your First App

    Building Your First App 创建你的第一个App项目 Dependencies and prerequisites 依赖关系和先决条件 * Android SDK * ADT Pl ...

  9. IoC之AutoFac(二)——解析服务

    阅读目录 一 Resolve方法 二 TryResolve和ResolveOptional方法 三 解析服务时传参 3.1 可用参数类型 3.2 带反射组件的参数 3.3 具有Lambda表达式组件的 ...

随机推荐

  1. Java基础教程——线程状态

    线程状态 JAVA定义了6种线程状态: Thread.State public enum State { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, ...

  2. 《Spring Boot 实战纪实》之如何攥写需求文档

    目录 前言 (思维篇)人人都是产品经理 1.需求文档 1.1 需求管理 1.2 如何攥写需求文档 1.3 需求关键点文档 2 原型设计 2.1 缺失的逻辑 2.2 让想法跃然纸上 3 开发设计文档 3 ...

  3. 【mq读书笔记】如何保证三个消息文件的最终一致性。

    考虑转发任务未成功执行,此时消息服务器Broker宕机,导致commitlog,consumeQueue,IndexFile文件数据不一致. commitlog,consumeQueue遍历每一条消息 ...

  4. Spring Cloud 学习 (十) Spring Security, OAuth2, JWT

    通过 Spring Security + OAuth2 认证和鉴权,每次请求都需要经过 OAuth Server 验证当前 token 的合法性,并且需要查询该 token 对应的用户权限,在高并发场 ...

  5. ubantu+nginx+uwsgi+django部署

    1.更新ubantu的apt apt-get update 必要时候更新系统:      apt-get upgrade 2.远程连接服务器 ssh 用户名@ip 上传代码 :        scp ...

  6. python核心高级学习总结7---------正则表达式

    正则表达式在爬虫项目中应用很广泛,主要方面就是在字符串处理方面,经常会涉及到字符串格式的校验,用起来经常要查看文档才能完成,所以抽了个时间将正则的内容复习了一下. Start re---导入re模块使 ...

  7. PyQt(Python+Qt)学习随笔:QTableView的标题表头相关属性

    老猿Python博文目录 老猿Python博客地址 一.概述 在Qt Designer中,对于表视图QTableView,在属性在下面有专门一栏列出了跟标题相关的属性,如图: 这些属性并不是QTabl ...

  8. PyQt(Python+Qt)学习随笔:QAbstractItemView的defaultDropAction属性

    老猿Python博文目录 老猿Python博客地址# 一.概述 defaultDropAction属性用于控制QAbstractItemView及其子类的实例视图中拖放时放下的默认操作.该属性的类型为 ...

  9. CommandLineRunner 可能会导致你的应用宕机停止,我劝你耗子尾汁

    hello,大家好,我是小黑,又和大家见面啦~~ 如果你去某度搜索关键词 CommandLineRunner 初始化资源 ,截止小黑同学写这篇推文之前,大概能收到 1,030,000 个结果. 网上大 ...

  10. THE BUG 队第一次团队作业

    1.队名: THE BUG 队 2.队员学号: 杨梓琦 3118005115(队长) 温海源,3118005109 陈杰才,3118005089 李华,3118005097 钟明康,311800512 ...