• 目录导航
  • 1.Autofac是什么
    •   1.1什么是DI和IOC
    •   1.2DI和IOC在项目中起到什么作用
  • 2.Autofac如何使用
    •   2.1下载
    •   2.2代码Demo
    •   2.3Demo分析
  • 3总结

1.Autofac是什么

  说到Autofac,我们就要首先了解依赖注入(Dependency Injection,简称DI)1.1节介绍。DI不是什么技术,而是一种设计模式,是用来降低计算机程序之间的耦合的。在.net平台,有很多依赖注入工具,比较于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,Autofac是一款较为轻量级的、性能优异的、支持xml配置的依赖注入工具。这也是为什么我选择先学习Autofac的原因。

  1.1依赖注入(DI)和控制反转(IOC)

  DI

    DI是一种软件设计模式,用来允许我们开发松耦合代码。DI是一种很好的方式去减少软件模块之间的紧耦合关心。DI帮助更好的去管理软件中的功能更新和复杂度。DI的目的是让代码可维护。
  依赖注入模式使用构造器对对象初始化并提供需要的依赖给对象,也就意味着允许你从类外部注入一个依赖项。

  IOC

    IOC控制反转模式是对DIP(依赖倒置原则)的一种实现。
  IOC指的是一种框架或运行时的编程风格,用来控制程序流程。
  IOC意味着我们可以改变常规的控制方式。它在DIP下得以实现。许多基于.net框架的软件开发都使用IOC。
  IOC更多的是一个通用术语,不仅仅局限于DI。

  以上文字摘入 http://www.cnblogs.com/sheng-jie/p/6512909.html——(什么是依赖注入(DI)和控制反转(IOC)-详解)【圣杰】

  不明白的同学可以去翻翻。

  1.2DI和IOC在项目中起到什么作用

  例如,假设你的客户端类需要使用一个服务类组件,那么你能做的就是让你的客户知道一类IService接口而不是服务类。这样,你就可以随时改变Service类的实现而不会中断已经部署的代码。

2.Autofac如何使用

  2.1下载

    首先你必须获取AutoFac,这里你可以通过各种方式加载它,我这里还是通过VS中的NuGet来加载AutoFac,不论是哪种方式,最终的目的就是将 Autofac.dll,Autofac.Configuration.dll 这两个程序集引用到你的项目中。这样在你的项目中,如果想使用AutoFac,只需添加其命名空间引用即可~ 这里我用的是2.6版本的(PS:Autofac.Configuration.dll V4.1 已经没有ConfigurationSettingsReader 用法稍有改变,还没去研究)

  2.2代码Demo

    在控制台程序中,首先

    /// <summary>
/// 定义一个Animal接口
/// </summary>
public interface IAnimal
{
void DogCall();
void CatCall();
}

    写一个类继承此接口

    public class Call: IAnimal
{
public void CatCall()
{
Console.WriteLine("喵喵喵");
} public void DogCall()
{
Console.WriteLine("汪汪汪");
}
}

    然后该Autofac出场了

        static void Main(string[] args)
{
        var builder = new ContainerBuilder();//创建一个IOC容器
        builder.RegisterType<Call>().As<IAnimal>();//通过AS可以让Call类中通过构造函数依赖注入类型相应的接口。
        //Build()方法生成一个对应的Container实例,这样,就可以通过Resolve解析到注册的类型实例。
        using (var container = builder.Build())
        {
          //当注册的类型在相应得到的容器中可以Resolve你的Call类中所有实例。
          var call = container.Resolve<IAnimal>();
          call.DogCall();
          call.CatCall();
        }         Console.ReadLine();      }

    结果

    

  2.3Demo分析

  //我们使用Autofac的步骤:
  //第一步,定义一个Container容器。
  //第二步,创建builder,并在builder中注册类型。
  //第三步,实例化容器。
  //第四步,在需要使用接口的地方,通过container来解析得到一个借口的实例。

  这里我们也明白了一点,类型是需要先进行注册,然后才能够通过Autofac进行获取。

然后我们能知道在Autofac中,先通过ContainerBuilder进行类型注册,然后通过ContainerBuilder的Build方法来获取IContainer类型实例,后面则可以通过该IContainer实例来获取注册类型的实例对象。

  

  另外:在项目中,我们想将该类型选择通过文件配置进行读取。Autofac自带了一个Autofac.Configuration.dll 非常方便地对类型进行配置,避免了程序的重新编译。

修改App.config:

在<configuration>根节点下加上(PS:configSections在程序配置文件中只能放在最前,不然会报配置文件未能初始化错误)

  <configSections>
<section name="autofac" type="Autofac.Configuration.SectionHandler, Autofac.Configuration"/>
</configSections>
<!--IOC为控制台项目名称-->
<autofac defaultAssembly="IOC">
<components>
<component type="IOC.Call, IOC" service="IOC.IAnimal" />
</components>
</autofac>

然后将RegisterType注册方法替换为通过配置文件的方式注册

//builder.RegisterType<Call>().As<IAnimal>();//通过AS可以让Call类中通过构造函数依赖注入类型相应的接口。
builder.RegisterModule(new ConfigurationSettingsReader("autofac"));

在简单实例中,我们已经看到了一种注册方式,那就是泛型注册:

builder.RegisterType<Class_1>();

其中还有很多注册的方式:

Lambda注册

    builder.Register(cc =>
{
var clas1 = new Class_1();
while (clas1.Id.ToString().Contains("a"))
{
clas1.Id = Guid.NewGuid();
}
return clas1;
});

程序集批量注册

    //获取当前应用程序加载程序集(C/S应用中使用)
var assembly = Assembly.GetExecutingAssembly();
var builder = new ContainerBuilder();
builder.RegisterAssemblyTypes(assembly); //注册所有程序集类定义的非静态类型

Module注册

在日常开发中,可能不同开发会负责不同的模块进行单独开发。在开发过程中,不同模块不同开发可能都有自己的类型需要注册到autofac中,但是如果每个人在注册时,都去修改一个指定地方的代码,这在进行代码合并时,是令人痛苦的。更好的方式是,每个开发不同的模块都有自己指定的类型注册区域,这样,在代码合并时,会减少很多代码冲突。

builder.RegisterModule<ModuleA>();

个人非常推荐使用Module,每个项目拥有自己的一个Module,这样的一个Module都有固定的未知,便于查找该项目中的注册及依赖关系。

3.总结

IoC/DI

关于IoC与DI的概念,网上有很多相关的博客,大家可以稍微了解一下,对比一下。

我个人的理解就是按照英文的中文翻译来理解的:

IoC: Inversion of Control 控制反转,将控制权进行反转,将本由自身控制的对象初始化交由外部IoC容器进行初始化;

DI: Dependency Injection 依赖注入,将对象依赖的其他对象,通过注入的方式进行初始化。

Autofac的用法远不止这些,这里面提到的只是我用到的一些内容。

Autofac官方网站:http://autofac.org/

Autofac在Github上的开源项目:https://github.com/autofac/Autofac

Autofac的学习资源:https://github.com/autofac/Autofac/wiki

开源框架Autofac使用入门的更多相关文章

  1. Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图的数据操作

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图实体类映射 下一篇:Farseer.net轻量级ORM开源 ...

  2. Farseer.net轻量级ORM开源框架 V1.x 入门篇:存储过程数据操作

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:存储过程实体类映射 下一篇:Farseer.net轻量级ORM ...

  3. Farseer.net轻量级ORM开源框架 V1.x 入门篇:存储过程实体类映射

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图的数据操作 下一篇:Farseer.net轻量级ORM开源 ...

  4. Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图实体类映射

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:表的数据操作 下一篇:Farseer.net轻量级ORM开源框 ...

  5. Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库上下文

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置文件 下一篇:Farseer.net轻量级ORM开源 ...

  6. Farseer.net轻量级ORM开源框架 V1.x 入门篇:表的数据操作

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:表实体类映射 下一篇:Farseer.net轻量级ORM开源框 ...

  7. Farseer.net轻量级ORM开源框架 V1.x 入门篇:表实体类映射

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库上下文 下一篇:Farseer.net轻量级ORM开源框 ...

  8. Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置文件

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:新版本说明 下一篇:Farseer.net轻量级ORM开源框架 ...

  9. Farseer.net轻量级ORM开源框架 V1.x 入门篇:新版本说明

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:没有了 下一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置 前言 V1.x版本终于到来了.本次 ...

随机推荐

  1. BAT-把当前用户以管理员权限运行(用户帐户控制:用于内置管理员帐户的管理员批准模式)

    相关资料: http://jingyan.baidu.com/article/72ee561a5dc24fe16138df95.html 网友求助:联想Y400,Win8系统 怎样获得管理员身份 要求 ...

  2. DataTable,DataView 排序和使用

    我们都知道在Sql Server可以用order by来排序,所以很多朋友在DataTable中排序也想到了用order by关键字.但这样实现是比较困难的,下面,我们讲解一种比较简单的方法: 控制台 ...

  3. spring.net的简单使用(三)创建对象

    这篇主要说对象的创建方式. spring.net提供了三种创建对象的方式,分别是构造器创建,静态工厂创建,实例工厂创建. 多数的情况下,容器会根据对象定义中type属性值去直接调用相应类型的某个构造器 ...

  4. 瑞芯微RK3399宣布系统开源,进入百余种行业市场!

    集微网消息,2月24日瑞芯微官方突然宣布, Rockchip RK3399Linux系统开源!作为Rockchip旗舰级芯片,RK3399具有高性能.高扩展.全能型应用特性. 这一重磅消息立马刷爆朋友 ...

  5. 一份React-Native学习指南

    直击现场 学习React-Native过程中整理的一份学习指南,包含 教程.开源app和资源网站等,还在不断更新中.欢迎pull requests! React-Native学习指南 本指南汇集Rea ...

  6. 介绍两种Timer定时器的使用

    第一种, 直接实例化Timer类,设置时间间隔,到达时间后执行想要执行的事件.代码示例: using System; using System.Collections.Generic; using S ...

  7. [2017.02.15] 《C++Primer5》 复习笔记

    编程语言主要是提供一个框架,用计算机能够处理的方式来表达问题的解决方法. 自定义数据类型class的基本思想是数据抽象dataabstraction和封装encapsulation.数据抽象是一种依赖 ...

  8. kafka笔记6

    我们讨论可靠性时,一般使用保证这个词,它是确保系统在各种不同的环境下能够发生一致的行为.Kafka可以在哪些方面作出保证呢? 1.Kafka可以保证分区消息的顺序 2.只有消息被写入分区的所有同步副本 ...

  9. python网络编程(转)

    本文代码转自廖雪峰老师的python教程 网络编程底层其实就是一个socket,代表两台机器之间的一个连接. s = socket.socket(socket.AF_INET, socket.SOCK ...

  10. 区块狗开发可以做出APP吗

    区块狗系统开发林生▉l8l加4896微9698电同步▉,区块狗奖励系统开发,区块狗平台系统开发,区块狗系统开发软件,区块狗系统开发案例,区块狗源码系统开发. 本公司是软件开发公司,华登区块狗/十二生肖 ...