阅读目录


一 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(二)——解析服务的更多相关文章

  1. android菜鸟学习笔记25----与服务器端交互(二)解析服务端返回的json数据及使用一个开源组件请求服务端数据

    补充:关于PHP服务端可能出现的问题: 如果你刚好也像我一样,用php实现的服务端程序,采用的是apache服务器,那么虚拟主机的配置可能会影响到android应用的调试!! 在android应用中访 ...

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

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

  3. Autofac官方文档翻译--二、解析服务--1解析参数传递

    Autofac 传递解析参数 注册组件公开相应的服务之后,你可以从container构造器和子lifetime scopes 中解析服务.使用Resolve()方法来实现: var builder = ...

  4. [翻译]Autofac 解析服务

    注册组件以后,通过容器或 ILifetimeScope 的 Resolve 方法解析服务: var builder = new ContainerBuilder(); builder.Register ...

  5. [转]ASP.NET MVC IOC 之AutoFac攻略

    本文转自:http://www.cnblogs.com/WeiGe/p/3871451.html 一.为什么使用AutoFac? 之前介绍了Unity和Ninject两个IOC容器,但是发现园子里用A ...

  6. ASP.NET MVC IOC 之AutoFac攻略

    一.为什么使用AutoFac? 之前介绍了Unity和Ninject两个IOC容器,但是发现园子里用AutoFac的貌似更为普遍,于是捯饬了两天,发现这个东东确实是个高大上的IOC容器~ Autofa ...

  7. IoC容器Autofac - Autofac + Asp.net MVC + EF Code First(转载)

    转载地址:http://www.cnblogs.com/JustRun1983/archive/2013/03/28/2981645.html  有修改 Autofac通过Controller默认构造 ...

  8. ASP.NET MVC IOC 之AutoFac

    ASP.NET MVC IOC 之AutoFac攻略 一.为什么使用AutoFac? 之前介绍了Unity和Ninject两个IOC容器,但是发现园子里用AutoFac的貌似更为普遍,于是捯饬了两天, ...

  9. IoC之AutoFac(三)——生命周期

    阅读目录 一.Autofac中的生命周期相关概念 二.创建一个新的生命周期范围 三.实例周期范围 3.1   每个依赖一个实例(InstancePerDependency) 3.2  单个实例(Sin ...

随机推荐

  1. CentOS 7开机出现welcome to emergency mode! 解决方法

    CentOS7.3昨天用的还好好的的,但是今天开机提示如下(如图提示):welcome to emergency mode!after logging in ,type “journalctl -xb ...

  2. 如何找到fastjson.jar这个阿里开源的jar包

    如何找到fastjson.jar这个阿里开源的jar包 转载 https://blog.csdn.net/AngelLover2017/article/details/84261261 Java编程中 ...

  3. mumu模拟器设置代理/打开网络连接(windows)

    adb_server.exe devicesadb_server.exe connect 127.0.0.1:7555adb_server.exe shell am start -a android. ...

  4. redis初步入门(2)

    一.redis持久化 1.redis是一个内存数据库,当redis服务器重启,或者电脑关机重启,数据会丢失,所以需要将redis内存中的数据持久化保存到硬盘文件中. 2.redis持久化机制 (1)R ...

  5. Redis自学笔记:3.5入门-集合类型

    3.5集合类型 3.5.1介绍 在集合中的每个元素都是不同的,且没有顺序 表3-4集合类型和列表类型的对比 - 集合类型 列表类型 存储内容 至多232-1个字符串 至多232-1个字符串 有序性 否 ...

  6. Centos6.5部署Rsyslog+LogAnalyzer中文乱码解决

    中文乱码 [root@log include]# pwd /zhang/app/loganalyzer-/src/include [root@log include]# vim functions_c ...

  7. (Android数据传递)应用之间的交互

    一个Android App 通常会有多个Activity.每个Activity的界面都扮演者用户入口的角色,允许用户执行一些特定的任务(例如:查看地图或者拍照等).为了让用户能够从一个Activity ...

  8. curl获取结果乱码的解决方法之CURLOPT_ENCODING(curl/Post请求)

    //php脚本开始   /*POST请求远程内容函数*/   function ppost($url,$data,$ref){ // 模拟提交数据函数       $curl = curl_init( ...

  9. linux下 玩转ptrace

    译者序:在开发Hust Online Judge的过程中,查阅了不少资料,关于调试器技术的资料在网上是很少,即便是UNIX编程巨著<UNIX环境高级编程>中,相关内容也不多,直到我在 ht ...

  10. 【Luogu3381】【模板】缩点

    本文同步发表于https://www.zybuluo.com/Gary-Ying/note/1235385 题目描述 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最 ...