原帖:http://www.cnblogs.com/xupng/archive/2011/07/12/2104766.html

Autofac为何物?它是.NET世界里现存的几种IOC框架其中之一,传说是速度最快的一个,同类的框架还有用过Castle Windsor、StructureMap、Unity等,如果你用过其中之一,那就好办了*^_^*。什么?你不知道什么是IOC,好吧,这里有一篇文章是讲解IOC是何物的,IOC中文名被称为依赖注入,看一下Martin Fowler大师写的《IoC容器和 Dependency Injection 模式 》。

通过上面的了解,我们基本上已经明白了Autofac为何物了,现在了解一下它相对于其它的IoC框架有什么优点:

  1. 它是C#语言联系很紧密,也就是说C#里的很多编程方式都可以为Autofac使用,例如可以用Lambda表达式注册组件。
  2. 较低的学习曲线,学习它非常的简单,只要你理解了IoC和DI的概念以及在何时需要使用它们。
  3. XML配置支持。
  4. 自动装配。
  5. 与Asp.Net MVC 3集成。
  6. 微软的Orchad开源程序使用的就是Autofac,从该源码可以看出它的方便和强大。

性能上面呢,有人为其做了测试:

说了这么多,在哪里可以得到它呢?你可以直接点击这里下载Autofac-Net4.0 ,也可以去它的官方网站上http://code.google.com/p/autofac/(英文)上获取最新的信息。

Autofac和其他容器的不同之处是它和C#语言的结合非常紧密,在使用过程中对你的应用的侵入性几乎为零,更容易与第三方的组件集成。

  Autofac的主要特性如下:

  1. 灵活的组件实例化:Autofac支持自动装配,给定的组件类型Autofac自动选择使用构造函数注入或者属性注入,Autofac还 可以基于lambda表达式创建实例,这使得容器非常灵活,很容易和其他的组件集成。 var defaultLog = new ConsoleLog(); builder.Register(c => new Connection(){ Log = c.ResolveOptional<ILog>() ?? defaultLog });大家知道lambda表达式并不是 在声明的时候的执行的,只有等到容器的Resolve()方法调用的时候,表达式才执行。表达式还有一个好处是不需要使用反射或者是使用XML语法来表 达。

  2. 资源管理的可视性:基于依赖注入容器构建的应用程序的动态性,意味着什么时候应该处理那些资源有点困难。Autofac通过跟踪特定作用域内的实例和依赖来解决这个问题(DeterministicDisposal)。IDisposable接口接口是把双刃剑,既是一个老孙手上的金箍棒,也是老孙头上的魔咒,有一种明确的方式告诉那一部分应该被清理,但是一个组件要何时处理并不是很容易确定的事情,比如说一个服务可以有多个实现的时候就变得很糟糕,组件的创建上(GOF的创建型设计模式)有的是通过工厂方式创建的,有的是单件方式创建的,有些需要被清理,有些却不需要清理。组件的使用者无法知道是否把转换为IDisposable接口调用它的Disposal方法。Autofac通过容器来跟踪组件的资源管理。对于不需要清理的对象,例如Console.Out,我们调用ExternallyOwned()方法告诉容器不用清理。细粒度的组件生命周期管理:应用程序中通常可以存在一个应用程序范围的容器实例,在应用程序中还存在大量的一个请求的范围的对象,例如一个HTTP请求,一个IIS工作者线程或者用户的会话结束时结束。通过嵌套的容器实例和对象的作用域使得资源的可视化。

  3. Autofac的设计上非常务实,这方面更多是为我们这些容器的使用者考虑:

  * 组件侵入性为零:组件不需要去引用Autofac。

  * 灵活的模块化系统:通过模块化组织你的程序,应用程序不用纠缠于复 杂的XML配置系统或者是配置参数。

  * 自动装配:可以是用lambda表达式注册你的组件,autofac会根据需要选择构造函数或者属 性注入

  * XML配置文件的支持:XML配置文件过度使用时很丑陋,但是在发布的时候通常非常有用

  * 组件的多服务支持:许 多设计师喜欢使用细粒度的接口来控制依赖 , autofac允许一个组件提供多个服务。

  过了2年多的开发,设计和试验,Autofac发布了第二版,针对1.4版本进行了重组,提供了更好的开发体验,你可以到这里(http://autofac.org/)下载正式的版本。

  2.1版本也带来许 多新特性:

  组件发现:Autofac 2可以从一个程序集的注册类型设置根据用户指定的规则:

1
2
3
4
var dataAccess = Assembly.GetExecutingAssembly(); 
builder.RegisterAssemblyTypes(dataAccess) 
    .Where(t => t.Name.EndsWith("Repository")) 
    .AsImplementedInterfaces();

  RegisterAssemblyTypes方法将 Repository模式的数据访问接口类都注册了,语法非常的简单。

  类型关系:Autofac通过自动支持小 型,有重点,强类型的包装,来表达动态的依赖关系。类型关系如下:

Relationship Adapter Type Meaning
A needs a B None Dependency
A needs a B at some point in the future Lazy<B> Delayed instantiation
A needs a B until some point in the future Owned<B> Controlled lifetime
A needs to create instances of B Func<B> Dynamic instantiation
A provides parameters of types X and Y to B Func<X,Y,B> Parameterisation
A needs all the kinds of B IEnumerable<B> Enumeration
A needs to know X about B before using it Meta<T> and Meta<B,X> Metadata interrogation

  组件元数据:.NET 4版本的Autofac 2.1支持类似于Managed Extensibility Framework (MEF)的功能。.NET 3.5(以及4.0)版本的提供了一个弱类型的Meta<T>类

  集成Managed Extensibility Framework (MEF),具体内容参看Autofac MEF integration wiki page,有一篇博客Hosting MEF Extensions in an IoC Container对这个架构进行了深入的讨论。

  2.1 版本不仅带来了许多新特性,而且对1.4版本也作了很大的改进:

  泛型现在是一等公民– Autofac 使用合适的泛型类型来解决通用的服务

  激活事件的参数实例是强类型的,例如 builder.RegisterType<Foo>().OnActivating(e => e.Instance.Start()).

  ASP.NET MVC的Controller注册更灵活和更简单,通过方法RegisterControllers() 进行注册,参看文章MVC Integration Changes in Autofac Beta 2.1.6.

  默认的Scope更改为 单件(Singleton)而不是factory

  支持“Resolve Anything”

  API 文档可以通过google进行搜索,例如http://www.google.com.au/search?q=site:api.autofac.org+ILifetimeScope。

Autofac介绍的更多相关文章

  1. NopCommerce使用Autofac实现依赖注入

    NopCommerce的依赖注入是用的AutoFac组件,这个组件在nuget可以获取,而IOC反转控制常见的实现手段之一就是DI依赖注入,而依赖注入的方式通常有:接口注入.Setter注入和构造函数 ...

  2. .Net Core 学习之路-AutoFac的使用

    本文不介绍IoC和DI的概念,如果你对Ioc之前没有了解的话,建议先去搜索一下相关的资料 这篇文章将简单介绍一下AutoFac的基本使用以及在asp .net core中的应用 Autofac介绍 组 ...

  3. AutoFac控制反转

    一.AutoFac介绍 Autofac是.NET里IOC(Inversion of Control,控制反转)容器的一种,同类的框架还有Spring.NET,Unity,Castle等.可以通过NuG ...

  4. AutoFac控制反转 转载https://blog.csdn.net/u011301348/article/details/82256791

    一.AutoFac介绍 Autofac是.NET里IOC(Inversion of Control,控制反转)容器的一种,同类的框架还有Spring.NET,Unity,Castle等.可以通过NuG ...

  5. .Net单元测试业务实践

    使用次数和允许取消次数单元测试实践 /** * prism.js Github theme based on GitHub's theme. * @author Sam Clarke */ code[ ...

  6. Lind.DDD.LindAspects方法拦截的介绍

    回到目录 什么是LindAspects 之前写了关于Aspects的文章<Lind.DDD.Aspects通过Plugins实现方法的动态拦截~Lind里的AOP>,今天主要在设计思想上进 ...

  7. Autofac 组件、服务、自动装配 《第二篇》

    一.组件 创建出来的对象需要从组件中来获取,组件的创建有如下4种(延续第一篇的Demo,仅仅变动所贴出的代码)方式: 1.类型创建RegisterType AutoFac能够通过反射检查一个类型,选择 ...

  8. Autofac 依赖注入

    介绍 Autofac是一款IOC框架,很轻量级性能非常高,自动注入很给力. NuGet Autofac:Autofac控制反转容器核心 Autofac.MVC5:提供IDependencyResolv ...

  9. 2_MVC+EF+Autofac(dbfirst)轻型项目框架_用户权限验证

    前言 接上面两篇 0_MVC+EF+Autofac(dbfirst)轻型项目框架_基本框架 与 1_MVC+EF+Autofac(dbfirst)轻型项目框架_core层(以登陆为例) .在第一篇中介 ...

随机推荐

  1. iOS开发:Swift多线程NSOperation的使用

    介绍: NSOperation是基于GCD实现,封装了一些更为简单实用的功能,因为GCD的线程生命周期是自动管理,所以NSOperation也是自动管理.NSOperation配合NSOperatio ...

  2. Androidstudio下Generate signed apk提示Error: Expected resource of type id [ResourceType]解决办法

    只需要在报错位置所在的类上面添加: @SuppressWarnings("ResourceType") 即可实现Generate signed apk.

  3. django - 好的 获取 参数值 方法

    第一步: # 参数列表 parameters = ('user_id', 'day_time', 'normal_data', 'hourly_data', 'product_id') # 需要传入的 ...

  4. 【Java学习笔记】Hello world

    package aaa; public class aaa { public static void main(String args[]){ System.out.println("hel ...

  5. wave文件(*.wav)格式、PCM数据格式

    1. 音频简介 经常见到这样的描述: 44100HZ 16bit stereo 或者 22050HZ 8bit mono 等等. 44100HZ 16bit stereo: 每秒钟有 44100 次采 ...

  6. 【CSS】css各种居中方法

    水平居中的text-align:center 和 margin:0 auto   这两种方法都是用来水平居中的,前者是针对父元素进行设置而后者则是对子元素.他们起作用的首要条件是子元素必须没有被flo ...

  7. TCP/IP详解学习笔记(9)-TCP协议概述

    终于看到了TCP协议,这是TCP/IP详解里面最重要也是最精彩的部分,要花大力气来读.前面的TFTP和BOOTP都是一些简单的协议,就不写笔记了,写起来也没啥东西. TCP和UDP处在同一层---运输 ...

  8. 【转】Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38377229 ,本文出自[张鸿洋的博客] 很多人面试肯定都被问到过,请问Andr ...

  9. util-判断当前年份所处的季度,并返回当前季度开始的月份

    ylbtech-funcation-util:  判断当前年份所处的季度,并返回当前季度开始的月份 判断当前年份所处的季度,并返回当前季度开始的月份. 1.A,Ylbtech.Model返回顶部 us ...

  10. 全栈工程师眼中的HTTP

    HTTP,是Web工程师每天打交道最多的一个基本协议.很多工作流程.性能优化都围绕HTTP协议来进行,但是我们对HTTP的理解是否全面呢?如果前端工程师和后台工程师坐在一起玩捉鬼游戏,他们对HTTP的 ...