使用嵌套的 ILifetimeScope 解析服务

Autofac 被设计为跟踪(track)和清理(dispose)资源。为确保资源被正确处理,务必将长时间运行的应用程序分成小的工作单元 (请求或事务),服务的解析应在工作单元级别的生命周期范围中进行。为 asp.net 实现的每个请求一个生命周期范围 是这项技术的一个示例。

使用模块进行配置

Autofac 块(module) 提供了一种组织容器配置的方式,并允许注入“部署时设置”。与 XML 配置相比,模块是更有弹性的方式。模块可以随时组合到 XML 配置中,提供两全其美的体验。

在委托注册中使用 As<T>() 方法

Autofac 从注册组件的表达式推断实现类的类型:

builder.Register(c => new Component()).As<IComponent>();

上面的代码中,组件的 LimitType 是 Component  类。以下两种类型转换的方式是等价的,但是未提供正确的 LimitType:

// 行的通,但应避免这种写法
builder.Register(c => (IComponent)new Component()); //行的通,但应避免这种写法
builder.Register<IComponent>(c => new Component());

使用构造函数注入

使用构造函数注入必需的依赖,使用属性注入可选的依赖,这个概念广为人知。但是,作为替代,也可以使用“空对象模式”“特例模式” 为可选服务提供默认的,什么都不做的实现。这样可以减少组件实现中处理特殊情况的分支(比如 if (Logger != null) Logger.Log("message");).

使用关联类型,而不是服务定位器

将容器存在公共静态属性中,以便组件可以访问到容器,或在全局的“Ioc”类中提供诸如 Resolve() 之类的函数,这些做法会使依赖注入的意图落空。这样的设计实际上是服务定位器器模式

如果组件有对容器(或生命周期范围)的依赖,请查看组件是如何使用容器获取服务的,然后将服务通过构造函数注入到容器中。

如果组件需要实例化其他组件,那么请为它使用关联类型 ,或者用更高级的方式同容器交互。

按照不特定到特定的次序注册组件

Autofac会覆盖组件注册。应用程序可以注册所有默认组件,然后读取配置文件,用定制的组件覆盖默认的版本。

使用 Profilers 检查性能

如果要进行优化,或怀疑内存泄漏,请首先使用profiler 工具(比如SlimTune, dotTrace, 或 ANTS)检查,确定程序时间到底消耗在哪里。很可能与设想的不同。

一次注册,多次解析

如有可能,请勿在工作单元执行过程中注册组件。注册组件的代价要远大于解析组件。使用生命周期范围和适当的实例范围使工作单元彼此隔离。

使用拉姆达表达式注册频繁使用的组件

如果确实需要榨取额外性能,最好的办法是标记出解析最频繁的组件,并使用拉姆达表达式注册代替类型注册:

builder.RegisterType<Component>();

改为:

builder.Register(c => new Component());

这可以让 Resolve 方法速度提高 10 倍,但是仅对出现在很多对象图中的组件有意义。请参考Aufofac中注册的概念

[翻译] Autoac 最佳实践和建议的更多相关文章

  1. android最佳实践的建议(翻译自android-best-practices)

    Best practices in Android development Use Gradle and its recommended project structure 使用Gradle和其推荐的 ...

  2. 给JavaScript初学者的24条最佳实践

    ­.fluid-width-video-wrapper { width: 100%; position: relative; padding: 0 } .fluid-width-video-wrapp ...

  3. 给JavaScript初学者的24条最佳实践(share)

    不错的文章,留个备份 原文链接: net.tutsplus   翻译: 伯乐在线- yanhaijing译文链接: http://blog.jobbole.com/53199/ 作为“30 HTML和 ...

  4. 给JavaScript初学者的24条最佳实践(转:http://www.cnblogs.com/yanhaijing/p/3465237.html)

    作为“30 HTML和CSS最佳实践”的后续,本周,我们将回顾JavaScript的知识 !如果你看完了下面的内容,请务必让我们知道你掌握的小技巧! 1.使用 === 代替 == JavaScript ...

  5. 《转载》Java异常处理的10个最佳实践

    本文转载自 ImportNew - 挖坑的张师傅 异常处理在编写健壮的 Java 应用中扮演着非常重要的角色.异常处理并不是功能性需求,它需要优雅地处理任何错误情况,比如资源不可用.非法的输入.nul ...

  6. 转载----给JavaScript初学者的24条最佳实践

      给JavaScript初学者的24条最佳实践 1.使用 === 代替 == JavaScript 使用2种不同的等值运算符:===|!== 和 ==|!=,在比较操作中使用前者是最佳实践. “如果 ...

  7. 给JavaScript24条最佳实践

    作为“30 HTML和CSS最佳实践”的后续,这篇文章将回顾JavaScript的知识 !如果你看完了下面的内容,请务必让我们知道你掌握的小技巧! 1.使用 === 代替 == JavaScript ...

  8. 001-dubbo基础-001-服务化最佳实践、异常处理逻辑

    1.参看地址 http://dubbo.apache.org/zh-cn/ 2.服务化最佳实践 分包 建议将服务接口.服务模型.服务异常等均放在 API 包中,因为服务模型和异常也是 API 的一部分 ...

  9. Java异常处理的10个最佳实践

    本文作者: ImportNew - 挖坑的张师傅 未经许可,禁止转载! 异常处理在编写健壮的 Java 应用中扮演着非常重要的角色.异常处理并不是功能性需求,它需要优雅地处理任何错误情况,比如资源不可 ...

随机推荐

  1. com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK assets/com.xx.xx

    完整的Error 信息(关键部分) Error:Execution failed for task ':fanwe_o2o_47_mgxz_dingzhi:transformResourcesWith ...

  2. Chrome开发者工具不完全指南(五、移动篇)

    前面介绍了Chrome开发者工具的大部分内容工具,现在介绍最后两块功能Audits和Console面板.一.Audits Audits面板会针对目前网页提出若干条优化的建议,这些建议分为两大类,一类是 ...

  3. Atitit xml命名空间机制

    Atitit xml命名空间机制 命名冲突1 使用前缀来避免命名冲突2 使用命名空间(Namespaces)2 XML Namespace (xmlns) 属性2 默认的命名空间(Default Na ...

  4. Qt on Android 核心编程

    Qt on Android 核心编程(最好看的Qt编程书!CSDN博主foruok倾力奉献!) 安晓辉 著   ISBN 978-7-121-24457-5 2015年1月出版 定价:65.00元 4 ...

  5. Sql Server系列:排序函数

    在SQL Server中有4个排序函数:ROW_NUMBER().RANK().DENSE_RANK()及NTILE()函数. 1. ROW_NUMBER()函数 ROW_NUMBER()函数为每条记 ...

  6. WPF开发查询加班小工具

    先说一下,我们公司是六点下班,超过7点开始算加班,但是加班的时间是从六点开始计算,以0.5个小时为计数,就是你到了六点半,不算加班半小时,但是加班到七点半,就是加班了一个半小时. 一.打卡记录 首先, ...

  7. mac下安装tomcat

    在window下面搭建tomcat环境很简单,那是因为我们不熟悉mac系统,当我们习惯了命令行的时候,也是so easy,只要通过以下几个步骤就可以解决,本人亲测可用,不会可以留言. 1.进入apch ...

  8. Visual Studio 2015无法进行Package Restore的原因和解决方案

    这篇文章是记录在我的当前电脑上面,安装Visual Studio 2015 Community Edition出现的无法进行Package Restore的问题,很可能在你的电脑上面无法重现.我的环境 ...

  9. 窥探Swift编程之强大的Switch

    之前初识Swift中的Switch语句时,真的是让人眼前一亮,Swift中Switch语句有好多特有而且特好用的功能.说到Switch, 只要是写过程序的小伙伴对Switch并不陌生.其在程序中的出镜 ...

  10. Objective-C中的内存管理

    在编程语言中是少不了对内存的管理的,内存对于计算机来说是宝贵的资源,所以对使用不到的资源进行回收是很有必要的.OC中使用引用计数和垃圾回收来管理内存,在OC中为每个对象分配一个引用计数器,当对象刚刚被 ...