Autofac介绍
原帖: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框架有什么优点:
- 它是C#语言联系很紧密,也就是说C#里的很多编程方式都可以为Autofac使用,例如可以用Lambda表达式注册组件。
- 较低的学习曲线,学习它非常的简单,只要你理解了IoC和DI的概念以及在何时需要使用它们。
- XML配置支持。
- 自动装配。
- 与Asp.Net MVC 3集成。
- 微软的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。