IoC容器Autofac正篇之依赖注入(七)
依赖注入,这个专业词我们可以分为两个部分来理解:
依赖,也就是UML中描述事物之间关系的依赖关系,依赖关系描述了事物A在某些情况下会使用到事物B,事物B的变化会影响到事物A;
注入,医生通过针头将药物注入到病人体内。注入也就是由外向内注入、灌输一些东西。
综合上面的说明,依赖注入就是A类依赖B类,B类的实例由外部向A注入而不是由A自己进行实例化或初始化。
三种注入方式
一.构造器注入
类A依赖于类B,类A的构造方法中,有一个参数为类B,在new 类A时会从外部为类B传入实例就是构造注入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class Program { static void Main( string [] args) { var b = new B(); var a = new A(b); } } class A { private B _b; public A(B b) { this ._b = b; } } class B { } |
构造器注入是默认行为,不需要设置,autofac自动完成了构造注入的工作。
二.属性注入
修改上面的A类,将变量_b通过属性暴露出来且删掉有参构造方法,然后看看我们平常写代码时怎么实现属性注入的:
1
2
3
4
5
6
7
8
9
|
class Program { static void Main( string [] args) { var a = new A(); var b = new B(); a.B = b; //通过属性来注入具有依赖关系的B } } |
来看看autofac是怎么进行属性注入的:
属性注入的所有注入方式都是在注册时定义的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
class Program { static void Main( string [] args) { var builder = new ContainerBuilder(); // 通过PropertiesAutowired制定类型A在获取时会自动注入A的属性 builder.RegisterType<A>().PropertiesAutowired(); builder.RegisterType<B>(); var container = builder.Build(); var a = container.Resolve<A>(); Console.Write( "Press any key to continue..." ); Console.ReadKey(); } } |
使用PropertiesAutowired也只是能指定某个类会自动进行属性注入。PropertiesAutowired方式会自动注入所有可以注入的属性,但是如果只想注入指定几个属性,可以使用除PropertiesAutowired以外的几种注入方式,WithProperty就是其中一种:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class Program { static void Main( string [] args) { var builder = new ContainerBuilder(); builder.RegisterType<A>().WithProperty( new NamedPropertyParameter( "B" , new B())); // builder.RegisterType<A>().WithProperty("B", new B()); //效果与上面相同<br> var container = builder.Build(); var a = container.Resolve<A>(); Console.Write( "Press any key to continue..." ); Console.ReadKey(); } } |
在注册篇里面有讲到一种lambda注册方式,lambda注册时,因为是写lambda表达式进行注册,其lambda内容可以写很多,其中就可以进行属性注入:
1
2
3
4
5
6
7
|
var builder = new ContainerBuilder(); builder.Register(c => { var _a = new A(); _a.B = new B(); //手动注入 return _a; }); |
三 方法注入
方法注入有两种方式,也就是属性注入的后两种方式:lambda以及事件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
var builder = new ContainerBuilder(); // lambda builder.Register(cc => { var _a = new A(); _a.MethodInjection( new B()); return _a; }); // 事件 builder.RegisterType<A>().OnActivated(e => { e.Instance.MethodInjection( new B()); }); |
MethodInjection为A的一个方法且它需要一个类型为B的参数,我们在外部通过方法的方式将B传入,这就是方法注入
尾述
个人还是推荐使用默认最简单的构造注入,属性注入推荐设置自动属性注入;方法注入还是不怎么推荐的。其实这里的推荐原则是这样的,需要在注册时进行指定注入的方式实际是不太好的,因为后来的人可能不太清楚每个类型的注入规则,还需要到注册的地方进行查看,而且不同人员写的不同,这样容易混乱。而在获取时进行注入,实际也是不太妥的,因为在实际的用法中,我们会将注册类型与接口进行关联,在获取是直接获取接口类型。也正因为我们获取时获取的是接口类型,我们无法保证接口的实际实现是不是具有我们预期的参数。
IoC容器Autofac正篇之依赖注入(七)的更多相关文章
- IoC容器Autofac正篇之依赖注入(六)
依赖注入,这个专业词我们可以分为两个部分来理解: 依赖,也就是UML中描述事物之间关系的依赖关系,依赖关系描述了事物A在某些情况下会使用到事物B,事物B的变化会影响到事物A: 注入,医生通过针头将药物 ...
- IoC容器Autofac正篇之类型注册(四)
Autofac类型注册 类型注册简单的从字面去理解就可以了,不必复杂化,只是注册的手段比较丰富. (一)类型/泛型注册 builder.RegisterType<Class1>(); 这种 ...
- IoC容器Autofac正篇之简单实例
先上一段代码. namespace ConsoleApplication3 { class Program { static void Main(string[] args) { ContainerB ...
- IoC容器Autofac正篇之类型注册(五)
Autofac类型注册 类型注册简单的从字面去理解就可以了,不必复杂化,只是注册的手段比较丰富. (一)类型/泛型注册 builder.RegisterType<Class1>(); 这种 ...
- IoC容器Autofac正篇之简单实例(四)
先上一段代码. namespace ConsoleApplication3 { class Program { static void Main(string[] args) { ContainerB ...
- IoC容器Autofac正篇之解析获取(五)
解析获取的方式有如下几种: Resolve class Program { static void Main(string[] args) { var builder = new ContainerB ...
- IoC容器Autofac正篇之解析获取(六)
解析获取的方式有如下几种: Resolve class Program { static void Main(string[] args) { var builder = new ContainerB ...
- IoC容器Autofac正篇之类型关联(服务暴露)(七)
类型关联 类型关联就是将类挂载到接口(一个或多个)上去,以方便外部以统一的方式进行调用(看下例). 一.As关联 我们在进行手动关联时,基本都是使用As进行关联的. class Program { s ...
- IoC容器Autofac正篇之类型关联(服务暴露)(八)
类型关联 类型关联就是将类挂载到接口(一个或多个)上去,以方便外部以统一的方式进行调用(看下例). 一.As关联 我们在进行手动关联时,基本都是使用As进行关联的. 1 2 3 4 5 6 7 8 ...
随机推荐
- MUI——页面的创建、显示、关闭
一.打开子页面 mui.init({ subpages:[{ url:your-subpage-url,//子页面HTML地址,支持本地地址和网络地址 id:your-subpage-id,//子页面 ...
- 初识SilkTest
简介 编辑 SilkTest 是业界领先的.用于对企业级应用进行功能测试的产品,可用于测试Web.Java或是传统的C/S结构.SilkTest 提供了许多功能,使用户能够高效率地进行软件自动化测试. ...
- util:properties与context:property-placeholder
spring 使用注解装配的Bean如何使用property-placeholder属性配置中的值 这个问题不大不小,以前偷懒凡是碰到需要引用属性文件中的类时就改用xml来配置. 今天看了下sprin ...
- 《Android系统源代码情景分析》连载回忆录:灵感之源
上个月,在花了一年半时间之后,写了55篇文章,分析完成了Chromium在Android上的实现,以及Android基于Chromium实现的WebView.学到了很多东西,不过也挺累的,平均不到两个 ...
- POJ 2656 Unhappy Jinjin
#include <stdio.h> int main() { ) { int i, n; ; scanf("%d", &n); ) break; ; i &l ...
- 转-CSS优先级(权重)解析
1.多个选择器可能会选择同一个元素,有3个规则,从上到下重要性降低: !important的用户样式 !important的作者样式 作者样式 用户样式 浏览器定义的样式 2. CSS规范为不同类型的 ...
- bzoj4318: OSU!&&CF235BLet's Play Osu!
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4318 4318: OSU! Time Limit: 2 Sec Memory Limit ...
- LeetCode OJ 85. Maximal Rectangle
Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1's and ...
- Gym 100553B Burrito King 无脑背包
题意就是你有n和m两个上限 吃一个东西会同时增加两个东西 m的值不能超过给定的m 问最后的n m值和每个东西吃了多少 贪心一下就好了 算一下性价比 从最大的开始吃 直到吃满了m n也一定是最大了 只是 ...
- HDU 1863 Kruskal求最小生成树
好久没写博客了写着玩的…… Kruskal这种东西离散都学过…… 一句话…… 添加当前图权值最小且构不成环的一条边 直到连接所有点…… 其他人好多Kruskal的模版 肯定有比我的好的…… 就是刷一波 ...