当前位置: 首页 > 编程日记 > 正文

AutoFac使用方法总结:Part I

utoFac是.net平台下的IOC容器产品,它可以管理类之间的复杂的依赖关系。在使用方面主要是register和resolve两类操作。 这篇文章用单元测试的形式列举了AutoFac的常用使用方法:

注册部分

使用RegisterType进行注册

[Fact]public void can_resolve_myclass(){var builder = new ContainerBuilder();builder.RegisterType<MyClass>();IContainer container = builder.Build();var myClass = container.Resolve<MyClass>();Assert.NotNull(myClass);}

注册为接口

[Fact]public void register_as_interface(){var builder = new ContainerBuilder();builder.Register(c => new MyClass()).As<MyInterface>();IContainer container = builder.Build();Assert.NotNull(container.Resolve<MyInterface>());Assert.Throws(typeof (ComponentNotRegisteredException), () => container.Resolve<MyClass>());}

使用lambda表达式进行注册

[Fact]public void can_register_with_lambda(){var builder = new ContainerBuilder();builder.Register(c => new MyClass());IContainer container = builder.Build();var myClass = container.Resolve<MyClass>();Assert.NotNull(myClass);}

带构造参数的注册

    [Fact]public void register_with_parameter(){var builder = new ContainerBuilder();builder.Register(c => new MyParameter());builder.Register(c => new MyClass(c.Resolve<MyParameter>()));IContainer container = builder.Build();Assert.NotNull(container.Resolve<MyClass>());}  

带属性赋值的注册

  [Fact]public void register_with_property(){var builder = new ContainerBuilder();builder.Register(c => new MyProperty());builder.Register(c => new MyClass(){Property = c.Resolve<MyProperty>()});IContainer container = builder.Build();var myClass = container.Resolve<MyClass>();Assert.NotNull(myClass);Assert.NotNull(myClass.Property);}      

Autofac分离了类的创建和使用,这样可以根据输入参数(NamedParameter)动态的选择实现类。

  [Fact]public void select_an_implementer_based_on_parameter_value(){var builder = new ContainerBuilder();builder.Register<IRepository>((c, p) =>{var type = p.Named<string>("type");if (type == "test"){return new TestRepository();}else{return new DbRepository();}}).As<IRepository>();IContainer container = builder.Build();var repository = container.Resolve<IRepository>(new NamedParameter("type", "test"));Assert.Equal(typeof(TestRepository),repository.GetType());}

AufoFac也可以用一个实例来注册,比如用在单例模式情况下:

  [Fact]public void register_with_instance(){var builder = new ContainerBuilder();builder.RegisterInstance(MyInstance.Instance).ExternallyOwned();IContainer container = builder.Build();var myInstance1 = container.Resolve<MyInstance>();var myInstance2 = container.Resolve<MyInstance>();Assert.Equal(myInstance1,myInstance2);}

注册open generic类型

  [Fact]public void register_open_generic(){var builder = new ContainerBuilder();builder.RegisterGeneric(typeof (MyList<>));IContainer container = builder.Build();var myIntList = container.Resolve<MyList<int>>();Assert.NotNull(myIntList);var myStringList = container.Resolve<MyList<string>>();Assert.NotNull(myStringList);}

对于同一个接口,后面注册的实现会覆盖之前的实现

  [Fact]public void register_order(){var containerBuilder = new ContainerBuilder();containerBuilder.RegisterType<DbRepository>().As<IRepository>();containerBuilder.RegisterType<TestRepository>().As<IRepository>();IContainer container = containerBuilder.Build();var repository = container.Resolve<IRepository>();Assert.Equal(typeof(TestRepository), repository.GetType());}

如果不想覆盖的话,可以用PreserveExistingDefaults,这样会保留原来注册的实现。

  [Fact]public void register_order_defaults(){var containerBuilder = new ContainerBuilder();containerBuilder.RegisterType<DbRepository>().As<IRepository>();containerBuilder.RegisterType<TestRepository>().As<IRepository>().PreserveExistingDefaults();IContainer container = containerBuilder.Build();var repository = container.Resolve<IRepository>();Assert.Equal(typeof (DbRepository), repository.GetType());}

可以用Name来区分不同的实现,代替As方法

  [Fact]public void register_with_name(){var containerBuilder = new ContainerBuilder();containerBuilder.RegisterType<DbRepository>().Named<IRepository>("DB");containerBuilder.RegisterType<TestRepository>().Named<IRepository>("Test");IContainer container = containerBuilder.Build();var dbRepository = container.ResolveNamed<IRepository>("DB");var testRepository = container.ResolveNamed<IRepository>("Test");Assert.Equal(typeof(DbRepository), dbRepository.GetType());Assert.Equal(typeof(TestRepository), testRepository.GetType());}

如果一个类有多个构造函数的话,可以在注册时候选择不同的构造函数

  [Fact]public void choose_constructors(){var builder = new ContainerBuilder();builder.RegisterType<MyParameter>();builder.RegisterType<MyClass>().UsingConstructor(typeof (MyParameter));IContainer container = builder.Build();var myClass = container.Resolve<MyClass>();Assert.NotNull(myClass);}

AutoFac可以注册一个Assemble下所有的类,当然,也可以根据类型进行筛选

  [Fact]public void register_assembly(){var builder = new ContainerBuilder();builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).Where(t => t.Name.EndsWith("Repository")).AsImplementedInterfaces();IContainer container = builder.Build();var repository = container.Resolve<IRepository>();Assert.NotNull(repository);}

转载于:https://www.cnblogs.com/wmlunge/archive/2013/03/28/2986729.html

相关文章:

canvas烟花锦集

canvas可以实现不同动画效果&#xff0c;本文主要记录几种不同节日烟花效果实现。 原文链接 实现一 效果地址 html <canvas id"canvas"></canvas>css body {background: #000;margin: 0; }canvas {cursor: crosshair;display: block; }js // when animat…

【青少年编程(第29周)】8月份的青少年编程组队学习结营了!

2021年09月05日&#xff08;周日&#xff09;晚20:00我们在青少年编程竞赛交流群开展了第二十九次直播活动。我们直播活动的主要内容如下&#xff1a; 首先&#xff0c;我们奖励了上周测试超过60分的小朋友。 其次&#xff0c;我们一起观看了电子学会等级测试流程的视频。 再…

led伏安特性实验误差分析_检测实验室误差分析知识汇编

2019-12-20 09:56:10 来源: 检测实验室误差分析知识汇编-检测家第一部分 误差理论简介在日常检测工作中&#xff0c;我们虽然有最好的检验方法、有检定合格的仪器设备、有满足检验要求的环境条件和熟悉检验工作的操作人员&#xff0c;但是&#xff0c;得到的检验结果却往往不可…

从Qcheck 1.3 不能在不同操作系统上运行问题(chro124、chro342)说开来------

【本文重在技巧学习&#xff0c;授人以鱼&#xff0c;不如授人以渔&#xff01;&#xff01;&#xff01;】 因为公司项目需要对带宽占用进行测试&#xff0c; 最近看电子工业出版社《网络管理工具使用详解》就qcheck 1.3 不能在不同的操作系统之间运行做一个总结。 本文以标题…

Spark笔试

1.Spark 的四大组件下面哪个不是 (D ) A.Spark Streaming B Mlib C Graphx D Spark R 2.下面哪个端口不是 spark 自带服务的端口 (C ) A.8080 B.4040 C.8090 D.18080 3.spark 1.4 版本的最大变化 (B ) A spark sql Release 版本 B 引入 Spark R C DataFrame D支持动态资源…

秦州:西瓜书 + 南瓜书 吃瓜系列 10. 集成学习(下)

Datawhale南瓜书是经典机器学习教材《机器学习》&#xff08;西瓜书&#xff09;的公式推导解析指南&#xff0c;旨在让在学习西瓜书的过程中&#xff0c;再也没有难推的公式&#xff0c;学好机器学习。 航路开辟者&#xff1a;谢文睿、秦州开源内容&#xff1a;https://githu…

iar定义arm版本_IAR Systems发布 IAR Embedded Workbench for ARM新版本

IAR Systems发布IAR Embedded Workbench for ARM嵌入式开发平台最新版本V5.41。相比于之前的版本&#xff0c;新版本软件在支持Cortex-M0上&#xff0c;将代码大小和执行速度这两个重要性能都提高了13%。本文引用地址&#xff1a;http://www.eepw.com.cn/article/106054.htmNXP…

UVA10110 Light, more light

链接地址。 分析&#xff1a; 如果n能被a整除&#xff0c;那么一定存在一个b使得a*b n。开关经两次变化相当于没有变化。那么只要看a b的那种特殊情况就OK了。 #include <stdio.h> #include <math.h> #include <stdlib.h>int main(){unsigned n, k;while(s…

【组队学习】【29期】Datawhale组队学习内容介绍

第29期 Datawhale 组队学习活动马上就要开始啦&#xff01; 本次组队学习的内容为&#xff1a; 编程实践&#xff08;数据可视化&#xff09;计算机视觉自然语言处理之情感分析吃瓜教程——西瓜书南瓜书李宏毅机器学习&#xff08;含深度学习&#xff09;动手学数据分析集成学…

json的简单的数据格式

json的简单数据格式 var arr{"obj1":["张三","12","女"],"obj2":["李四","12","女"],"obj3":["王五","12","女"],} var str""; $.each(a…

eplise怎么连接数据库_基于手机信令的大数据分析教程(一)数据导入数据库

前言该套教程以一个初学大数据的菜鸟视角&#xff0c;编写数据分析处理的整套流程。写得较为详(luo)细(suo)&#xff0c;希望适用于任何城乡规划大数据的初学者。持续更新中&#xff0c;若有错误&#xff0c;望指正&#xff01;1、任务总纲&#xff08;1&#xff09;职住数据导…

反序列化xml

我是.net 菜鸟。 今天学习一下反序列化xml&#xff0c;即将xml文件转换成程序更好识别的对象。 下面来看一个例子。这是一个xml文件。 <xml> <students> <student> <fields> <field value"name"><field> <field value"i…

【青少年编程】【三级】小鸡吃虫

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取以往学习的材料&#xff08;视频、代码、文档&…

Android拍照得到全尺寸图片并进行压缩/拍照或者图库选择 压缩后 图片 上传

http://www.jb51.net/article/77223.htm https://www.cnblogs.com/breeze1988/p/4019510.html

display会影响canvas吗_多动症会影响智商吗?

小智&#xff08;化名&#xff09;小的时候非常皮&#xff0c;上学了也不老实&#xff0c;学习成绩还很差&#xff0c;一直是倒数&#xff0c;还有人说他智商低。父母带他到医院检查&#xff0c;一切都正常&#xff0c;智商也没问题。直到最近他被检查出多动症&#xff0c;小智…

SQL Server 数据库清除日志的方法

方法一&#xff1a; 1、打开查询分析器&#xff0c;输入命令 BACKUP LOG database_name WITH NO_LOG 2、再打开企业管理器--右键要压缩的数据库--所有任务--收缩数据库--收缩文件--选择日志文件--在收缩方式里选择收缩至xxm,这里会给出一个允许收缩到的最小m数,直接输入这个数,…

Axure8.0 网页 or App 鼠标滚动效果

1、index 页下添加一个内联框架&#xff0c;设置好自己想要的尺寸。 2、右键点击该内联框架转换为动态面板&#xff0c;并取消勾选“自动调整为内容尺寸”。 3、双击 “内联框架”选择并双击“state1” 切换到“内联框架的state1”页面&#xff0c;将“内联框架”组件的滚动条设…

【组队学习】【29期】1. 编程实践(数据可视化)

1. 编程实践&#xff08;数据可视化&#xff09; 航路开辟者&#xff1a;杨剑砺、杨煜、耿远昊、李运佳、居凤霞领航员&#xff1a;范佳慧航海士&#xff1a;杨剑砺、伊雪、肖桐、李晴晴、蔡婧旎 基本信息 开源内容&#xff1a;https://github.com/datawhalechina/fantastic…

训练不出结果_智能训练仪:专业化智能防控近视训练设备

视觉训练精准化&#xff0c;近视防控效果佳智能训练仪小百科 智能训练仪是一款近视防控全功能智能康复设备&#xff0c;一机集成十大视功能康复模块&#xff0c;针对各种视功能异常引发的儿童及青少年假…

贪心算法之最优装载

贪心算法通过一系列的选择来得到问题的解。它所做的每一个选择都是当前状态下局部最好选择。从许多的贪心算法求解的问题可以看到可用贪心算法求解的问题一般具有两个重要的性质&#xff1a;贪心选择性质和最优子结构性质。 1、贪心选择性质 贪心选择性质是 指所求问题的整体最…

百度认为什么样的网站更有抓取和收录价值

百度认为什么样的网站更有抓取和收录价值 百度认为什么样的网站更有抓取和收录价值呢?我们从下面几个方面简单介绍.鉴于技术保密以及网站运营的差异等其他原因&#xff0c;以下内容仅供站长参考&#xff0c;具体的收录策略包括但不仅限于所述内容。 第一方面&#xff1a;网站创…

【组队学习】【29期】2. 计算机视觉

2. 计算机视觉 航路开辟者&#xff1a;王程伟、任乔牧、张强、李芝翔领航员&#xff1a;杜蕊航海士&#xff1a;王程伟、任乔牧、张强、李芝翔 基本信息 开源内容&#xff1a;https://github.com/datawhalechina/team-learning-cv/tree/master/ImageProcessingFundamentals内…

python 列表维度_如何输出python中list的维度

python中输出list的维度可以使用numpy来实现:import numpy as np a = [[1,2],[3,4]] print(np.array(a).shape) 扩展: reshape&resize&shape改变数组维度 reshape函数:不改变原数组维度,有返回值 resize函数:直接改变原数组维度,无返回值 shape属性:直接改变原数…

SWFTools PDF转换为SWF

前言 在iText 制作PDF这篇博文中只是简单的介绍了如何制作PDF&#xff0c;为了能让PDF在Web页面中显示&#xff0c;我还需要通过SWFTools工具将PDF文件转换为SWF文件&#xff0c;然后通过SWF文件显示在Web网页中&#xff0c;本次主要是实践SWFTools工具的简单使用&#xff0c;可…

Springboot 中 Mybatis 的使用

2019独角兽企业重金招聘Python工程师标准>>> 官方文档&#xff1a; Mybatis开发团队为Spring Boot 提供了 MyBatis-Spring-Boot-Starter 方便使用。 要使用MyBatis-Spring-Boot-Starter模块&#xff0c;只需要在类路径中包含 mybatis-spring-boot-autoconfigure.ja…

【组队学习】【29期】3. 自然语言处理之情感分析

3. 自然语言处理之情感分析 航路开辟者&#xff1a;芙蕖、戴治旭、陈海顺领航员&#xff1a;初晓宇航海士&#xff1a;芙蕖、戴治旭、陈海顺、汪超 基本信息 开源内容&#xff1a;https://github.com/datawhalechina/team-learning-nlp/tree/master/Emotional_Analysis内容属…

cvpr 深度估计_无监督单目视频深度估计中的uncertainty方法(CVPR#x27;20)

Contribution对11种使用uncertainty方法的全面评估深度挖掘uncertainty对depth estimation起到的作用提出一个新颖的self-teaching方法去model uncertainty文中使用的uncertainty estimation分为两个类别&#xff1a;empirical uncertainty estimation和predictive uncertainty…

python之CSV文件格式

1、csv文件是以一些以逗号分隔的值 import csv filename "wenjian.csv" with open(filename) as f:reader csv.reader()header next(reader)for index,column in enumerate(header):#enumerate函数获取每个元素的索引及其值print(index,column) 转载于:https://ww…

最受欢迎的ASP.NET的CMS下载

http://www.csdn.net/article/2011-11-28/308172 转载于:https://www.cnblogs.com/xuddong/archive/2013/04/08/3071733.html

【组队学习】【29期】4. 吃瓜教程——西瓜书+南瓜书

4. 吃瓜教程——西瓜书南瓜书 航路开辟者&#xff1a;谢文睿、秦州领航员&#xff1a;刘琳航海士&#xff1a;谢文睿、秦州 基本信息 开源内容&#xff1a;https://github.com/datawhalechina/pumpkin-bookB 站视频&#xff1a;https://www.bilibili.com/video/BV1Mh411e7VU…