IoC容器Autofac正篇之依赖注入(六)
依赖注入,这个专业词我们可以分为两个部分来理解:
依赖,也就是UML中描述事物之间关系的依赖关系,依赖关系描述了事物A在某些情况下会使用到事物B,事物B的变化会影响到事物A;
注入,医生通过针头将药物注入到病人体内。注入也就是由外向内注入、灌输一些东西。
综合上面的说明,依赖注入就是A类依赖B类,B类的实例由外部向A注入而不是由A自己进行实例化或初始化。
三种注入方式
一.构造器注入
类A依赖于类B,类A的构造方法中,有一个参数为类B,在new 类A时会从外部为类B传入实例就是构造注入
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通过属性暴露出来且删掉有参构造方法,然后看看我们平常写代码时怎么实现属性注入的:
class Program
{
static void Main(string[] args)
{
var a = new A();
var b = new B();
a.B = b; //通过属性来注入具有依赖关系的B
}
}
来看看autofac是怎么进行属性注入的:
属性注入的所有注入方式都是在注册时定义的。
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就是其中一种:
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()); //效果与上面相同
var container = builder.Build();
var a = container.Resolve<A>(); Console.Write("Press any key to continue...");
Console.ReadKey();
}
}
在注册篇里面有讲到一种lambda注册方式,lambda注册时,因为是写lambda表达式进行注册,其lambda内容可以写很多,其中就可以进行属性注入:
var builder = new ContainerBuilder();
builder.Register(c =>
{
var _a = new A();
_a.B = new B(); //手动注入
return _a;
});
三 方法注入
方法注入有两种方式,也就是属性注入的后两种方式:lambda以及事件
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正篇之解析获取(六)
解析获取的方式有如下几种: Resolve class Program { static void Main(string[] args) { var builder = new ContainerB ...
- 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正篇之类型关联(服务暴露)(七)
类型关联 类型关联就是将类挂载到接口(一个或多个)上去,以方便外部以统一的方式进行调用(看下例). 一.As关联 我们在进行手动关联时,基本都是使用As进行关联的. class Program { s ...
- IoC容器Autofac正篇之类型关联(服务暴露)(八)
类型关联 类型关联就是将类挂载到接口(一个或多个)上去,以方便外部以统一的方式进行调用(看下例). 一.As关联 我们在进行手动关联时,基本都是使用As进行关联的. 1 2 3 4 5 6 7 8 ...
随机推荐
- ulimit 参数介绍
Linux对于每个用户,系统限制其最大进程数.为提高性能,可以根据设备资源情况,设置各linux 用户的最大进程数 可以用ulimit -a 来显示当前的各种用户进程限制.下面我把某linux用户的最 ...
- 使用游标循环进行SQL更新插入的SQL语句
使用SQL中的循环,可以实现许多我们需要的操作,比如SQL更新操作.下面就为您介绍使用游标循环进行SQL更新插入的SQL语句写法,希望对您深入学习SQL更新有所帮助. --开始事务 BEGIN TRA ...
- TravelCMS旅游网站系统诞生记-1(后台框架篇)
- RDLC报表上下标实现
例:m的6次方 ="M"&ChrW(8310) Character Name Character Num Entity Hex Entity Superscript Cha ...
- Windows命令行(DOS命令)教程-5 (转载)http://arch.pconline.com.cn//pcedu/rookie/basic/10111/15325_4.html
5. copy copy在英文中是复制的意思 [功能] 复制一个或一组文件到指定的磁盘或目录中 [格式] copy [C:][path][filename.ext] [C:][path]filenam ...
- hdu 2191多重背包
悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...
- 运行一个Hadoop Job所需要指定的属性
1.设置job的基础属性 Job job = new Job(); job.setJarByClass(***.class); job.setJobName("job name") ...
- keepalived+httpd 做web服务的高可用
场景: 环境中有两台httpd服务器,一台做主,一台做备用:平时只用主向外提供http服务:当主宕机后,keepalived把vip绑定到备机上去,这样就由备机提供http服务了. **keepalv ...
- Core Data入门-备用
简介 Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象. ...
- C语言读写伯克利DB 3
gcc -o channeldb channel.c -db -Wall # -Wall参数等价于执行lint,即:进行代码的静态分析,它可以指出未初始化的变量,未使用的变量 #include < ...