IoC之AutoFac(二)——解析服务
阅读目录
一 Resolve方法
在您的组件注册了适当的服务后,您可以从内置的容器和子生命周期范围中解析服务。 您可以使用Resolve()方法,还是使用上篇的例子:

1 private static IContainer Container { get; set; }
2 static void Main(string[] args)
3 {
4 var builder = new ContainerBuilder();
5 //注册服务
6 builder.RegisterType<ConsoleOutput>().As<IOutput>();
7 Container = builder.Build();
8 //解析服务
9 using (var scope=Container.BeginLifetimeScope())
10 {
11 var output= scope.Resolve<IOutput>();
12 output.Write("outputsomething");
13 Console.ReadKey();
14 }
15 }

解析服务时,Autofac将自动链接服务的整个依赖关系层次,并解析完全构建服务所需的任何依赖关系。 如果您的循环依赖关系被错误地处理,或者缺少必需的依赖关系,那么您将得到一个DependencyResolutionException。
二 TryResolve和ResolveOptional方法
如果您有可能注册或可能不被注册的服务,您可以使用ResolveOptional()或TryResolve()来尝试对服务进行有条件解决:

1 //解析服务
2 using (var scope = Container.BeginLifetimeScope())
3 {
4 //1.ResolveOptional:IOutput注册的话解析,未被注册返回null
5 var service = scope.ResolveOptional<IOutput>();
6
7 //2.TryResolve:IOutput注册的话解析获取一个类型实例,未注册返回null
8 IOutput output = null;
9 //如果有IOutPut服务,执行输出
10 if (scope.TryResolve<IOutput>(out output))
11 {
12 output.Write("outputsomething");
13 }
14 Console.ReadKey();
15 }

三 解析服务时传参
解析服务的时候,您可能会发现需要将参数传递给Autofac。 (如果您在注册时知道值,则可以在注册中提供它们,详细见上篇。)Resolve()方法使用可变长度的参数列表在注册时接受相同的参数类型。
3.1 可用参数类型
Autofac提供了几种不同的参数匹配策略:
NamedParameter - 按名称匹配目标参数
TypedParameter - 按类型匹配目标参数(需要精确类型匹配)
ResolvedParameter - 灵活的参数匹配
NamedParameter和TypedParameter只能提供常量值。
ResolvedParameter可以用作提供从容器动态检索的值的方法,例如。 通过名称解析服务。
3.2 带反射组件的参数
当您解析基于反射的组件时,类型的构造函数可能需要您需要根据运行时值指定的参数,这在注册时不可用。 您可以在Resolve()方法调用中使用一个参数来提供该值。
假设您有一个配置读取器,需要传递一个配置部分名称:

1 public class ConfigReader : IConfigReader
2 {
3 public ConfigReader(string configSectionName)
4 {
5 // 存储配置的节点名称
6 }
7
8 // 读取基于节点名称的配置
9 }

您可以将参数传递给Resolve()调用,如下所示:
//注册
builder.RegisterType<ConfigReader>().As<IConfigReader>();
//解析
var reader = scope.Resolve<IConfigReader>(new NamedParameter("configSectionName", "mySectionName"));
如果您有多个参数,只需通过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")));
3.3 具有Lambda表达式组件的参数
使用lambda表达式组件注册,您需要在lambda表达式中添加参数处理,因此当Resolve()调用传入时,可以利用它们。
在组件注册表达式中,您可以通过更改用于注册的代理签名来使用传入参数。 而不是仅仅使用IComponentContext参数,而是接收一个IComponentContext和一个IEnumerable <Parameter>:
相关实例:
// c 是当前组件上下文
// 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"));
IoC之AutoFac(二)——解析服务的更多相关文章
- android菜鸟学习笔记25----与服务器端交互(二)解析服务端返回的json数据及使用一个开源组件请求服务端数据
补充:关于PHP服务端可能出现的问题: 如果你刚好也像我一样,用php实现的服务端程序,采用的是apache服务器,那么虚拟主机的配置可能会影响到android应用的调试!! 在android应用中访 ...
- Autofac官方文档翻译--二、解析服务--2隐式关系类型
Autofac 隐式关系类型 Autofac 支持自动解析特定类型,隐式支持组件与服务间的特殊关系.要充分利用这些关系,只需正常注册你的组件,但是在使用服务的组件或调用Resolve()进行类型解析时 ...
- Autofac官方文档翻译--二、解析服务--1解析参数传递
Autofac 传递解析参数 注册组件公开相应的服务之后,你可以从container构造器和子lifetime scopes 中解析服务.使用Resolve()方法来实现: var builder = ...
- [翻译]Autofac 解析服务
注册组件以后,通过容器或 ILifetimeScope 的 Resolve 方法解析服务: var builder = new ContainerBuilder(); builder.Register ...
- [转]ASP.NET MVC IOC 之AutoFac攻略
本文转自:http://www.cnblogs.com/WeiGe/p/3871451.html 一.为什么使用AutoFac? 之前介绍了Unity和Ninject两个IOC容器,但是发现园子里用A ...
- ASP.NET MVC IOC 之AutoFac攻略
一.为什么使用AutoFac? 之前介绍了Unity和Ninject两个IOC容器,但是发现园子里用AutoFac的貌似更为普遍,于是捯饬了两天,发现这个东东确实是个高大上的IOC容器~ Autofa ...
- IoC容器Autofac - Autofac + Asp.net MVC + EF Code First(转载)
转载地址:http://www.cnblogs.com/JustRun1983/archive/2013/03/28/2981645.html 有修改 Autofac通过Controller默认构造 ...
- ASP.NET MVC IOC 之AutoFac
ASP.NET MVC IOC 之AutoFac攻略 一.为什么使用AutoFac? 之前介绍了Unity和Ninject两个IOC容器,但是发现园子里用AutoFac的貌似更为普遍,于是捯饬了两天, ...
- IoC之AutoFac(三)——生命周期
阅读目录 一.Autofac中的生命周期相关概念 二.创建一个新的生命周期范围 三.实例周期范围 3.1 每个依赖一个实例(InstancePerDependency) 3.2 单个实例(Sin ...
随机推荐
- Kafka生产者案例报警告SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
一.SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". 这个报警告的原因简单来说时因为slf4j的版本 ...
- Linux学习之后台任务与定时任务(二十)
Linux学习之后台任务与定时任务 目录 后台任务 把进程放入后台 查看后台任务 将后台暂停的工作恢复到前台执行 将后台暂停的工作恢复到后台执行 定时任务 手动启动服务 将服务设置为自启动 用户的co ...
- 005.Ceph文件系统基础使用
一 Ceph文件系统 1.1 概述 CephFS也称ceph文件系统,是一个POSIX兼容的分布式文件系统. 实现ceph文件系统的要求: 需要一个已经正常运行的ceph集群: 至少包含一个ceph元 ...
- Linux学习笔记 11
移除文件 #rm -i file 有信息确认的文件删除 #rm file1 file2 有信息确认的文件删除 #rm -rf file 强制删除file文件
- 虚拟主机的IIS连接数和访问流量限制各是什么
网址:http://zhidao.baidu.com/question/40279863IIS连接数,就是你的网站同时允许多少个人连接你的网站.IIS连接数为100就是,同时允许100人连接你的网站, ...
- 洛谷.4655.[CEOI2017]Building Bridges(DP 斜率优化 CDQ分治)
LOJ 洛谷 \(f_i=s_{i-1}+h_i^2+\min\{f_j-s_j+h_j^2-2h_i2h_j\}\),显然可以斜率优化. \(f_i-s_{i-1}-h_i^2+2h_ih_j=f_ ...
- 【ACM】 1231 最大连续子序列
[1231 最大连续子序列 ** Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- php 将时间格式 转为时间戳
<?php $gte = "2018-08-08"; $year=((int)substr($gte,0,4));//取得年份: $month=((int)substr($g ...
- 连接到docker 指定的一个容器中
1.docker run -itd ubuntu 2.sudo docker ps 3.PID=$(docker-pid containerID) 返回一个p_id 4.nsenter --targ ...
- python反转列表的三种方式
1.内建函数reversed() li =[1, 2, 3, 4, 5, 6] a = list(reversed(li)) print (a) 注意:reversed()函数返回的是一个迭代器,而不 ...