依赖注入,这个专业词我们可以分为两个部分来理解:

依赖,也就是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正篇之依赖注入(七)的更多相关文章

  1. IoC容器Autofac正篇之依赖注入(六)

    依赖注入,这个专业词我们可以分为两个部分来理解: 依赖,也就是UML中描述事物之间关系的依赖关系,依赖关系描述了事物A在某些情况下会使用到事物B,事物B的变化会影响到事物A: 注入,医生通过针头将药物 ...

  2. IoC容器Autofac正篇之类型注册(四)

    Autofac类型注册 类型注册简单的从字面去理解就可以了,不必复杂化,只是注册的手段比较丰富. (一)类型/泛型注册 builder.RegisterType<Class1>(); 这种 ...

  3. IoC容器Autofac正篇之简单实例

    先上一段代码. namespace ConsoleApplication3 { class Program { static void Main(string[] args) { ContainerB ...

  4. IoC容器Autofac正篇之类型注册(五)

    Autofac类型注册 类型注册简单的从字面去理解就可以了,不必复杂化,只是注册的手段比较丰富. (一)类型/泛型注册 builder.RegisterType<Class1>(); 这种 ...

  5. IoC容器Autofac正篇之简单实例(四)

    先上一段代码. namespace ConsoleApplication3 { class Program { static void Main(string[] args) { ContainerB ...

  6. IoC容器Autofac正篇之解析获取(五)

    解析获取的方式有如下几种: Resolve class Program { static void Main(string[] args) { var builder = new ContainerB ...

  7. IoC容器Autofac正篇之解析获取(六)

    解析获取的方式有如下几种: Resolve class Program { static void Main(string[] args) { var builder = new ContainerB ...

  8. IoC容器Autofac正篇之类型关联(服务暴露)(七)

    类型关联 类型关联就是将类挂载到接口(一个或多个)上去,以方便外部以统一的方式进行调用(看下例). 一.As关联 我们在进行手动关联时,基本都是使用As进行关联的. class Program { s ...

  9. IoC容器Autofac正篇之类型关联(服务暴露)(八)

    类型关联  类型关联就是将类挂载到接口(一个或多个)上去,以方便外部以统一的方式进行调用(看下例). 一.As关联 我们在进行手动关联时,基本都是使用As进行关联的. 1 2 3 4 5 6 7 8 ...

随机推荐

  1. selenium grid的使用与配置

    一.selenium grid的组成与作用:由一个集线器hub和多个客户机node组成,如果你的程序需要在不用的浏览器,不同的操作系统上测试,而且比较多的case需要多线程远程执行,那么一个比较好的测 ...

  2. 基于jdk调用天气服务案例及问题

    问题1:解析wsdl文件时出现 把网络上的wsdl保存到本地,把圈起来的那段删掉 代码: 当返回结果不是String类型时: 输入城市编码去查找 所以: 问题二:如果把本地wsdl文件删除的话需要 三 ...

  3. 配置Windows为NTP服务器

    建议使用 ntpd for windows,这是一个ntp的windows版,操作和linux相似 下载:https://www.meinbergglobal.com/english/sw/ntp.h ...

  4. 折腾一天,终于配置好了,ssl证书,启用了https,用的阿里云ECS服务器

    阿里云ECS服务器配置了ssl证书, httpd-ssl.conf  的配置很重要,网站目录一定要设置正确. 阿里云的虚拟空间,弹性Web,目前好像还不支持ssl证书. 最后要网站强制https,下面 ...

  5. SLF4J 使用简记

    SLF4J 使用简记 使用 SLF4J有一段时间了,在此作上些许记录,以作提示. 本文使用的实际实现的日志框架是 Log4j,所以使用 log4j.properties 文件 SLF4J 需要引入的j ...

  6. [JS高程]引用类型(Object、Array)

    引用类型:Object.Array Object: person.name   =>推荐,除非必须使用变量([])来表示 person["name"] 区别:[]可以通过变量 ...

  7. POJ 1789 Truck History(Prim+邻接矩阵)

    ( ̄▽ ̄)" #include<iostream> #include<cstdio> #include<cstring> #include<algo ...

  8. Graph Algorithm

    1.定义 A graph consists of a set of vertices V and a set of edges E. Each edge is a pair (v, w), where ...

  9. 从零开始学Axure原型设计(入门篇)

    如果说Sketch是最美.最简洁的设计软件,那么Axure就是最强大的原型制作软件.Axure不仅能制作静态的视觉稿.页面,还能添加交互动作,是进行原型设计的最佳软件之一.虽然Axure的学习曲线比较 ...

  10. satisfy_dependencies_for: Cannot satisfy the following dependencies for kmod-usb-storage:

    卸载了包 : opkg remove kmod-ath9k - 3.10.49+2014-05-22-1 重新进行安装时出现如下错误: root@hbg:/tmp# opkg install /tmp ...