依赖注入容器Autofac

在.NET上现在存在许多的依赖注入容器, 我也在实践中使用过Castle WindsorStructureMapAutofacUnity这些容器的简要介绍可以参看:

IoC in .NET part 1: Autofac

IoC in .NET part2: StructureMap

IoC in .NET part 3: Ninject 2 beta

IoC in .NET part4: Spring.NET

IoC in .NET part 5: Using CastleWindsor container

IoC Containers in .NET part 6: Unity Container

这里主要介绍一下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允许一个组件提供多个服务。

Autofac的目前稳定版本是1.4,支持.NET和Silverlight应用程序。2.1版本目前处于Beta状态,2.1版本相对于1.4版本做了些调整,可以参照http://code.google.com/p/autofac/wiki/NewInV2,如果你对Autofac感兴趣,尽快开始Autofac之旅吧,可以给你不一样的思路。

autofac文档

http://alexmg.com/?tag=/autofac

http://www.lanwin.de/2010/07/20/why-i-moved-from-windsor-to-autofac/

AutoFac使用方法总结:Part III

AutoFac使用方法总结:Part II

AutoFac使用方法总结:Part I

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏葡萄城控件技术团队

ASP.NET AJAX UpdatePanel 控件实现剖析

使用ASP.NET AJAX框架我们可以搭建快速响应、具有丰富的用户体验的AJAX Web应用程序,而该框架的UpdatePanel控件则提供了一种非常简单的方...

423100
来自专栏王大锤

再谈RunLoop

29640
来自专栏高性能服务器开发

关于windows完成端口(IOCP)的一些理解(五)

系列目录 关于windows完成端口(IOCP)的一些理解(一) 关于windows完成端口(IOCP)的一些理解(二) 关于windows完成端口(IOCP)...

518110
来自专栏王大锤

再谈RunLoop

14030
来自专栏张善友的专栏

ASP.NET Web API RC版本新特性:Web API的帮助文档制作

InfoQ上有一篇文章是 使用IAPIExplorer列举ASP.NET Web API,文章针对的版本是ASP.NET Web API Beta版本写,IAP...

295100
来自专栏高性能服务器开发

关于windows完成端口(IOCP)的一些理解(二)

1 不知道你是否记得前面中说过每消耗一个预先准备客户端的socket,就要补上一个。这个代码现在看来就应该放在连接成功事件里面了: DWORD ThreadFu...

46690
来自专栏跟着阿笨一起玩NET

C#遍历系统所安装的打印机,使用WMI方式获取打印机的所有属性

C#里面,虽然在 System.Drawing.Printing 这个namespace下,提供了一些对系统打印机的访问功能,但是,说实话是太弱了,对获取打印机...

27410
来自专栏菩提树下的杨过

Flash/Flex学习笔记(10):FMS 3.5之Hello World!

Adobe的FMS真的是一个倍儿牛叉的技术!(至少Silverlight在"实时广播"方面目前还没有任何能超越FMS的迹象) 曾经盛极一时的tudou,ku6,...

21780
来自专栏张善友的专栏

CLR 4.0 安全模型

在公共语言运行时(CLR)过往的版本中,安全模型一直是最为复杂的模块之一,由于涉及Evidence,CAS策略等机制,难以被用户使用。在Silverlight中...

19780
来自专栏我和未来有约会

silverlight.js详解.

原文:Understanding the silverlight.js helper class and silverlight object creation...

23360

扫码关注云+社区

领取腾讯云代金券