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 ...
随机推荐
- Codeforces 998D. Roman Digits 【打表找规律】
<题目链接> 题目大意: 现在有无限个 1,5,10,50这四个数字,从中恰好挑选n个数字,问你这些数字的和总共有多少种不同的情况. 解题分析: 由于此题 n 的范围特别大,达到了1e9, ...
- Person Re-ID行人重试别梳理
定义 是利用计算机视觉技术判断图像或者视频序列中是否存在特定行人的技术.给定一张切好块的行人图像 (probe image,), 从一大堆切好块的图像 (gallery images) 中找到同一身份 ...
- 深度学习中的batch_size,iterations,epochs等概念的理解
在自己完成的几个有关深度学习的Demo中,几乎都出现了batch_size,iterations,epochs这些字眼,刚开始我也没在意,觉得Demo能运行就OK了,但随着学习的深入,我就觉得不弄懂这 ...
- sql - 递归update
declare v_rlt ):; l_sql ); -- variable that contains a query l_c sys_refcursor; -- cursor variable(w ...
- Python flask+react+antd实现登陆demo
这两天在研究flask和antd,想把这俩个东西结合来使用,单独学antd的时候用的是dva来配置,但是发现这样与flask结合的话需要启动两个服务,作为flask只是作为数据的接口,并没用用到其强大 ...
- 负载均衡---ribbon
Ribbon:提供云端负载均衡,有多种负载均衡策略可供选择,可配合服务发现和断路器使用. 上一篇简单讲解了eureka的使用,这一篇文章基于上一篇的基础上,讲一下springcloud的另一个重要的组 ...
- VBA中FIND方法的使用说明zz
Find 方法在区域中查找特定信息. 语法 表达式.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, ...
- mongoDB,mongoose,没有数组就添加,如果有了数组,就向数组中添加新元素
db.getCollection('photos').findOneAndUpdate("5b028e71f32bd5004f905879", //findByIdAndUpd ...
- BZOJ2616 : SPOJ PERIODNI
长为$A$,宽为$B$的矩阵放$K$个车的方案数$=C(A,K)\times C(B,K)\times K!$. 建立笛卡尔树,那么左右儿子独立,设$f[i][j]$表示$i$子树内放$j$个车的方案 ...
- 什么是OKR?
什么是OKR OKR全称是Objectives and Key Results,即目标与关键成果法.OKR是一套定义和跟踪目标及其完成情况的管理工具和方法.1999年 Intel公司发明了这种方法,后 ...