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。
Autofac介绍的更多相关文章
- NopCommerce使用Autofac实现依赖注入
NopCommerce的依赖注入是用的AutoFac组件,这个组件在nuget可以获取,而IOC反转控制常见的实现手段之一就是DI依赖注入,而依赖注入的方式通常有:接口注入.Setter注入和构造函数 ...
- .Net Core 学习之路-AutoFac的使用
本文不介绍IoC和DI的概念,如果你对Ioc之前没有了解的话,建议先去搜索一下相关的资料 这篇文章将简单介绍一下AutoFac的基本使用以及在asp .net core中的应用 Autofac介绍 组 ...
- AutoFac控制反转
一.AutoFac介绍 Autofac是.NET里IOC(Inversion of Control,控制反转)容器的一种,同类的框架还有Spring.NET,Unity,Castle等.可以通过NuG ...
- AutoFac控制反转 转载https://blog.csdn.net/u011301348/article/details/82256791
一.AutoFac介绍 Autofac是.NET里IOC(Inversion of Control,控制反转)容器的一种,同类的框架还有Spring.NET,Unity,Castle等.可以通过NuG ...
- .Net单元测试业务实践
使用次数和允许取消次数单元测试实践 /** * prism.js Github theme based on GitHub's theme. * @author Sam Clarke */ code[ ...
- Lind.DDD.LindAspects方法拦截的介绍
回到目录 什么是LindAspects 之前写了关于Aspects的文章<Lind.DDD.Aspects通过Plugins实现方法的动态拦截~Lind里的AOP>,今天主要在设计思想上进 ...
- Autofac 组件、服务、自动装配 《第二篇》
一.组件 创建出来的对象需要从组件中来获取,组件的创建有如下4种(延续第一篇的Demo,仅仅变动所贴出的代码)方式: 1.类型创建RegisterType AutoFac能够通过反射检查一个类型,选择 ...
- Autofac 依赖注入
介绍 Autofac是一款IOC框架,很轻量级性能非常高,自动注入很给力. NuGet Autofac:Autofac控制反转容器核心 Autofac.MVC5:提供IDependencyResolv ...
- 2_MVC+EF+Autofac(dbfirst)轻型项目框架_用户权限验证
前言 接上面两篇 0_MVC+EF+Autofac(dbfirst)轻型项目框架_基本框架 与 1_MVC+EF+Autofac(dbfirst)轻型项目框架_core层(以登陆为例) .在第一篇中介 ...
随机推荐
- bzoj2875: [Noi2012]随机数生成器
矩阵乘法. x[n] = {x[0],1} * ( {a,0} ^ n ) {b,1} 写成这样谁能看懂.... noi里的大水题.我居然 #include<cstdio> #includ ...
- UVa 1625 Color Length
思路还算明白,不过要落实到代码上还真敲不出来. 题意: 有两个由大写字母组成的颜色序列,将它们合并成一个序列:每次可以把其中一个序列开头的颜色放到新序列的尾部. 对于每种颜色,其跨度定义为合并后的序列 ...
- 待实践二:MVC3下的3种验证 (1)前台 jquery validate验证 (2)MVC实体验证 (3)EF生成的/自己手写的 自定义实体校验(伙伴类+元素据共享)
MVC3下的3种验证 (1):前台Jquery Validate脚本验证 引入脚本 <script src="../js/jquery.js" type="text ...
- 载入在线jQuery库
以百度库为例 <script src="http://libs.baidu.com/jquery/1.11.1/jquery.min.js"></script&g ...
- poj 1780 Code
//题目描述:KEY公司开发出一种新的保险箱.要打开保险箱,不需要钥匙,但需要输入一个正确的.由n位数字组成的编码.这种保险箱有几种类型,从给小孩子玩的玩具(2位数字编码)到军用型的保险箱(6位数字编 ...
- css的框架——base.css
一.常用的base.css文件(也是比较简略的,但按需增加) body,ul,li,ol,dl,dd,h1,h2,h3,h4,h5,h6,input,p{ margin:;} ul,ol { padd ...
- LwIP编译方法以及选项说明
条件编译命令 作用说明 IP_SOF_BROADCAST LWIP_IGMP
- 最好用的汉字转拼音代码PinYin4Objc(PinYin4J的objc版本)
转:https://github.com/kimziv/PinYin4Objc 最好用的汉字转拼音代码PinYin4Objc(PinYin4J的objc版本)(更新到v1.1.1,增加block异步处 ...
- [android]如何让TextView使用超链接
找了很多网址,最后是这个有说到. 总的做法是: 1.(当然也可以从Res中获取.) tv.setText(Html.fromHtml("<a href=\"http://ww ...
- 对LR analysis的平均事务响应时间和summary中时间值不同的解释
最近在做性能测试对LR结果分析时,又碰到了关于summary里与平均事务响应时间中各交易的响应时间值不同的问题.在此做个记录. 若交易中设置了思考时间,分析时需要注意查看是否过滤思考时间. 设置是否包 ...