在.NET上如今存在许多的依赖注入容器, 如:Castle Windsor、StructureMap、Autofac 、Unity。html
这里主要介绍一下Autofac,Autofac和其余容器的不一样之处是它和C#语言的结合很是紧密,在使用过程当中对你的应用的侵入性几乎为零,更容易与第三方的组件集成。Autofac的主要特性以下:git
1)灵活的组件实例化:Autofac支持自动装配,给定的组件类型Autofac自动选择使用构造函数注入或者属性注入,Autofac还能够基于lambda表达式建立实例,这使得容器很是灵活,很容易和其余的组件集成。 github
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的设计上很是务实,这方面更可能是为咱们这些容器的使用者考虑:ui
- 组件侵入性为零:组件不须要去引用Autofac;
- 灵活的模块化系统:经过模块化组织你的程序,应用程序不用纠缠于复杂的XML配置系统或者是配置参数;
- 自动装配:能够是用lambda表达式注册你的组件,autofac会根据须要选择构造函数或者属性注入;
- XML配置文件的支持:XML配置文件过分使用时很丑陋,可是在发布的时候一般很是有用;
- 组件的多服务支持:许多设计师喜欢使用细粒度的接口来控制依赖 , autofac容许一个组件提供多个服务;
参考资料:url
AutoFac文档
spa
http://alexmg.com/?tag=/autofac
https://www.codeproject.com/Articles/25380/Dependency-Injection-with-Autofac
源码下载地址https://github.com/autofac/Autofac
参考连接:http://www.cnblogs.com/shanyou/archive/2010/02/07/1665451.html