[翻译] Autoac 最佳实践和建议
使用嵌套的 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 最佳实践和建议的更多相关文章
- android最佳实践的建议(翻译自android-best-practices)
Best practices in Android development Use Gradle and its recommended project structure 使用Gradle和其推荐的 ...
- 给JavaScript初学者的24条最佳实践
.fluid-width-video-wrapper { width: 100%; position: relative; padding: 0 } .fluid-width-video-wrapp ...
- 给JavaScript初学者的24条最佳实践(share)
不错的文章,留个备份 原文链接: net.tutsplus 翻译: 伯乐在线- yanhaijing译文链接: http://blog.jobbole.com/53199/ 作为“30 HTML和 ...
- 给JavaScript初学者的24条最佳实践(转:http://www.cnblogs.com/yanhaijing/p/3465237.html)
作为“30 HTML和CSS最佳实践”的后续,本周,我们将回顾JavaScript的知识 !如果你看完了下面的内容,请务必让我们知道你掌握的小技巧! 1.使用 === 代替 == JavaScript ...
- 《转载》Java异常处理的10个最佳实践
本文转载自 ImportNew - 挖坑的张师傅 异常处理在编写健壮的 Java 应用中扮演着非常重要的角色.异常处理并不是功能性需求,它需要优雅地处理任何错误情况,比如资源不可用.非法的输入.nul ...
- 转载----给JavaScript初学者的24条最佳实践
给JavaScript初学者的24条最佳实践 1.使用 === 代替 == JavaScript 使用2种不同的等值运算符:===|!== 和 ==|!=,在比较操作中使用前者是最佳实践. “如果 ...
- 给JavaScript24条最佳实践
作为“30 HTML和CSS最佳实践”的后续,这篇文章将回顾JavaScript的知识 !如果你看完了下面的内容,请务必让我们知道你掌握的小技巧! 1.使用 === 代替 == JavaScript ...
- 001-dubbo基础-001-服务化最佳实践、异常处理逻辑
1.参看地址 http://dubbo.apache.org/zh-cn/ 2.服务化最佳实践 分包 建议将服务接口.服务模型.服务异常等均放在 API 包中,因为服务模型和异常也是 API 的一部分 ...
- Java异常处理的10个最佳实践
本文作者: ImportNew - 挖坑的张师傅 未经许可,禁止转载! 异常处理在编写健壮的 Java 应用中扮演着非常重要的角色.异常处理并不是功能性需求,它需要优雅地处理任何错误情况,比如资源不可 ...
随机推荐
- 微信小程序DEMO初体验
小程序虽然被炒的很热,但是绝大部分人却从未亲自体验过,在2017年的上班第一天,献上一个小程序DEMO,您可以体验! 注意:由于微信限制,只能使用扫一扫来体验下方小程序DEMO. DEMO首页截图如下 ...
- Mycat配置及使用详解.
首先我们来看下什么是Mycat:MyCat:开源分布式数据库中间件, 这里定义的很简单, 就是分布式数据库的中间件. 其实Mycat 是可以时mysql进行集群的中间件, 我们可以对mysql来分库分 ...
- css3使用技巧:细线边框的3种不同的写法
一般的app边框描边的线都小于一像素,那么我就像往常一样直接描了1px的边框,虽然是1px可是结果和app里的描边完全不一样“粗了”,所以就在网找了一下看看有没有解决方法,可是找了一会没找到,那咋办, ...
- 通过HTTP协议上传文件
HTTP是很常见的协议,虽然用得很多,但对细节的了解却是很浅,这回通过向服务端上传文件信息来理解细节.网络库的选择:1.WinHTTP是windows下常用的库:2.CURL是广受喜爱的开源 ...
- KVC & KVO
KVC和KVO看上去又是两个挺牛的单词简写,KVC是Key-Value Coding的简写,是键值编码的意思.KVO是Key-Value Observing的简写,是键值观察的意思.那么我们能拿KV ...
- Objective-C中把URL请求的参数转换为字典
上一篇博客中是把URL转换为字典,那么我们如何把URL请求中的参数封装成字典,然后再封装成数组呢?对OC中字符串操作熟练的小伙伴们应该觉得这是一个a+b的问题,没错把URL中的参数转换为字典主要是对字 ...
- Android随笔之——跨进程通信(一) Activity篇
在Android应用开发中,我们会碰到跨进程通信的情况,例如:你用QQ通讯录打电话的时候会调用系统的拨号应用.某些新闻客户端可以将新闻分享到QQ.微信等应用,这些都是跨进程通信的情况.简而言之,就是一 ...
- 构建自己的PHP框架--创建组件的机制
在之前的博客中,我们完成了基本的Model类,但是大家应该还记得,我们创建数据库的pdo实例时,是hard好的配置,并且直接hard在Model类中. 代码如下: public static func ...
- 附录B 安装MySql数据库
B.1 卸载旧的MaySql程序 第一步 查找以前是否安装有mysql 使用命令查看是否已经安装过mysql: #rpm -qa | grep -i mysql 如果没有结果,则可以进行mysq ...
- $\LaTeX$笔记:首字下沉
$\LaTeX$系列根目录: Latex学习笔记-序 首字下沉 \IEEEPARstart{W}{ith} ,第一个参数W会变大,占用两行,第二个参数”ith”变会大写. 如代码 \IEEEPARst ...