[翻译] 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 应用中扮演着非常重要的角色.异常处理并不是功能性需求,它需要优雅地处理任何错误情况,比如资源不可 ...
随机推荐
- Log4net入门使用
简介 几乎所有的大型应用都会有自己的用于跟踪调试的API.因为一旦程序被部署以后,就不太可能再利用专门的调试工具了.然而一个管理员可能需要有一套强大的日志系统来诊断和修复配置上的问题. 经验表明,日志 ...
- Spark读取HBase
背景:公司有些业务需求是存储在HBase上的,总是有业务人员找我要各种数据,所以想直接用Spark( shell) 加载到RDD进行计算 摘要: 1.相关环境 2.代码例子 内容 1.相关环境 Spa ...
- Gitcafe绑定自定义域名
之前将自己练习写作工具替换为Markdown,部署工具改为Hexo,并且将托管地搬家到GitCafe之后,便是被各种的舒爽所围绕.具体折腾的详情参见使用Hexo搭建专属Blog.她们的组合方便快捷,让 ...
- Disk IO Performance
一,使用 Performance counter 监控Disk IO问题 1,Physical Disk vs. Logical Disk Windows可以在一个Physical Disk上划出若干 ...
- ExtJs控件属性配置详细
序言: 1.本文摘自网络,看控件命名像是4.0以前的版本,但控件属性配置仍然可以借鉴(不足之处,以后项目用到时再续完善). Ext.form.TimeField: 配置项: ...
- 【Win10应用开发】协议-下篇:自定义多个协议
前面介绍了如何为应用程序自定义协议,于是有朋友会问,我希望为我的应用注册多个协议,不同的协议处理不同的事情,能吗?答案是能的. 方法主要在配置清单文件上,这里我给出一个例子,示例应用将注册两个协议,分 ...
- Linux下修改Mysql的用户(root)的密码
修改的用户都以root为列.一.拥有原来的myql的root的密码: 方法一:在mysql系统外,使用mysqladmin# mysqladmin -u root -p password " ...
- Ubuntu杂记——Ubuntu下以USB方式连接Android手机调试
在Ubuntu下进行Android开发,发现自己的手机就算打开USB连接.USB调试还是连不上,一直都是显示??????.百度了很多,发现都是要改“ /etc/udev/rules.d/50-andr ...
- 【Java心得总结二】浅谈Java中的异常
作为一个面向对象编程的程序员对于 下面的一句一定非常熟悉: try { // 代码块 } catch(Exception e) { // 异常处理 } finally { // 清理工作 } 就是面向 ...
- 1Z0-053 争议题目解析694
1Z0-053 争议题目解析694 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 694.As part of archiving the historical data, you ...