使用嵌套的 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命令(46):vmstat命令

    vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存.进程.CPU活动进行监控.他是对系统的整体情况进行统计,不足之处是无法对某个进程进行深 ...

  2. PHP SESSION机制,从存储到读取

    PHP中,如果要获取SESSION数据,必须要有对应的session_id,session_id的获取方式有两种 1.基于客户端的cookie 2.基于url 先说第一种情况,基于客户端的cookie ...

  3. ECMAScript

    在Javascript中,万物皆对象,但对象也有区别,大致可以分为两类,即:普通对象(Object)和函数对象(Function). 一般而言,通过new Function产生的对象是函数对象,其他对 ...

  4. 静态Include和动态Include测试并总结

    主要代码 hjzgg.css .center-div{ width:auto; margin-left: 40%; margin-right: 40%; display: block; positio ...

  5. MySQL学习笔记十一:数据导入与导出

    数据导入 1.mysqlimport命令行导入数据 在使用mysqlimport命令导入数据时,数据来源文件名要和目标表一致,不想改文件名的话,可以复制一份创建临时文件,示例如下. 建立一个文本use ...

  6. C#:Md5和Sha1两种加密方式

    1.新建控制台应用程序 2.新建类 EncryptHelper.cs public static class EncryptHelper { /// <summary> /// 基于Md5 ...

  7. ubuntu安装虚拟磁带库mhvtl

    项目需要用到磁带库,先装个虚拟磁带库mhvtl来模拟下. 1 下载源码 从网站https://sites.google.com/site/linuxvtl2/home#mhvtl-download下载 ...

  8. 自己使用的一个.NET轻量开发结构

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIgAAABFCAIAAAAerjlvAAAE2UlEQVR4nO2a3U/bVhiH+bdyPaqpmx

  9. SQLServer学习笔记系列11

    一.写在前面的话 身体是革命的本钱,这句放在嘴边常说的话,还是拿出来一起共勉,提醒一起奋斗的同僚们,保证睡眠,注意身体!偶尔加个班,也许不曾感觉到身体发出的讯号,长期晚睡真心扛不住!自己也制定计划,敦 ...

  10. AngularJs之Scope作用域

    前言: 上篇博文AngularJs之directive中说了Scope作用域是个大坑,所以拿出来作为重点总结! 什么是scope AngularJS 中,作用域是一个指向应用模型的对象,它是表达式的执 ...