使用嵌套的 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. LINUX 下安装一些东西,PHP Apach SSL 等

    首先下载apache sourcecode:http://www.apache.org/dyn/closer.cgi configure: error: Cannot find ldap librar ...

  2. 基于zipkin分布式链路追踪系统预研第一篇

    本文为博主原创文章,未经博主允许不得转载. 分布式服务追踪系统起源于Google的论文“Dapper, a Large-Scale Distributed Systems Tracing Infras ...

  3. json、javaBean、xml互转的几种工具介绍

    json.javaBean.xml互转的几种工具介绍 转载至:http://blog.csdn.net/sdyy321/article/details/7024236 工作中经常要用到Json.Jav ...

  4. 关于angularjs中的jQuery

    关于angularjs中的jQuery 下面是一个小例子,用来说明我经常看到的一种模式.我们需要一个开关型的按钮.(注意:这个例子的代码有点装逼,并且有点冗长,只是为了用来代表更加复杂一些的例子,这些 ...

  5. Minor【 PHP框架】5.事件

    框架Github地址:github.com/Orlion/Minor (如果觉得还不错给个star哦(^-^)V) 框架作者: Orlion 知乎:https://www.zhihu.com/peop ...

  6. Minor【 PHP框架】4.服务容器与服务提供者

    框架Github地址:github.com/Orlion/Minor (如果觉得还不错给个star哦(^-^)V) 框架作者: Orlion 知乎:https://www.zhihu.com/peop ...

  7. Delete Volume 操作 - 每天5分钟玩转 OpenStack(57)

    今天讨论 cinder 如何删除 volume . 状态为 Available 的 volume 才能够被 delete.如果 volume 当前已经 attach 到 instance,需要先 de ...

  8. MySQL学习笔记十六:锁机制

    1.数据库锁就是为了保证数据库数据的一致性在一个共享资源被并发访问时使得数据访问顺序化的机制.MySQL数据库的锁机制比较独特,支持不同的存储引擎使用不同的锁机制. 2.MySQL使用了三种类型的锁机 ...

  9. tn文本分析语言(二) 基本语法

    tn是desert和tan共同开发的一种用于匹配,转写和抽取文本的语言.解释器使用Python实现,代码不超过1000行. 本文主要介绍tn的基本语法.高级内容可以参考其他篇章.使用这样的语法,是为了 ...

  10. Mac 可设置环境变量的位置、查看和添加PATH环境变量

    Mac 启动加载文件位置(可设置环境变量) ------------------------------------------------------- (1)首先要知道你使用的Mac OS X是什 ...