• 【翻译Autofac的帮助文档】1.入门指南


    【写在前面】尝试做完一件工作之外自我觉得有意义的一件事,那就从翻译Autofac的帮助文档吧。

    入门指南

    将Autofac集成你的应用程序的步骤通常很简单,一般是:

    • 时刻以IOC(控制反转)的思想来规划你的应用程序
    • 在你的Porject中添加Autofac引用
    • 按照如下步骤设计应用程序的启动环节
      • 创建一个ContainerBuilder
      • 向ContainerBuilder注册组件
      • 通过ContainerBuilder的Build()方法获得Container(后续需用到)
    • 在应用程序运行环节时,按如下步骤执行
      • 通过Container获得一个lifetime scope
      • 通过lifetime scope解析出组件实例
      • 通过实例继续执行

    本篇将通过入门指南实现一个简单的Console应用程序,一旦有了基础,后续可以延伸集成WCF、ASP.NET等等。

    规划应用程序

    先简单解释一下IOC(控制反转)。
    通常情况下,类A若需要类B的一些功能,则在类A中需要通过“new”操作来完成创建和使用功能,这样在代码层面就固定住了类A和类B之间的相互依赖关系。这样的“依赖”,在后续的重构或修改时,影响面很大。
    而IOC(控制反转)的思维,则是取消,由类A来创建类B,变更为在执行期间,由IOC容器来根据需要和约定自动创建类B来给类A使用。

    Martin Fowler有一篇著名的文章,解释何谓IOC,可以点击“链接”查看。

    在本篇的示例中,我们将定义一个类,这个类可以输出一些数据;但我们不想和Console绑定住,因为我们并不能确定在实际使用过程中Console是否真的可用。

    我们通常可以这样实现:

    添加Autofac引用

    第一步,需要在项目中添加Autofac的引用。建议通过NuGet方式(如下图),将会自动添加到项目中。

    Autofac,除了Core之外,还有很多扩展,例如和ASP.NET MVC集成等等。

    截至目前为止,Autofac Core最新版本为4.6.0,对应.net framework 4.5.

    应用程序启动

    在应用程序启动环节,你需要创建一个ContainerBuilder来注册组件。
    一个组件,可以是一个表达式,一个.NET类型,又或者可以是一个或者多个带依赖项的Service等等。

    简单来说,如下这个实现接口的.NET类,我们有两种方式来定义它的类型。 

    • 作为类型自身,那就是SomeType
    • 作为接口,那就是IService

    如上的例子,组件就是SomeType,同时也是包括SomeType和IService的两种形态的服务。

    在Autofac,你可以按照如下方式向ContainerBuilder注册组件。

    对于我们的示例应用程序,我们需要注册所有组件(类),并公开它们的服务(接口),这样就可以很好地连接起来。

    我们还需要保存Container,以便以后可以使用它来解析类型。

    现在我们有一个Container,所有的组件都已注册,并且它们正在公开适当的服务。让我们利用它吧。

    应用程序执行

    在应用程序执行,你需要使用你注册的组件时,是通过lifetime scope来解析出相应组件实例的。

    Container本身也是一个lifetime scope,从技术角度来说,你可以从Container直接解析出组件,然而并不推荐这样用。

    解析一个组件时,将会根据所定义的实例范围,创建一个对象的新实例。(解析一个组件大致相当于调用“new”实例化一个类。很简单的一个类比。),某些组件可能有特殊的Dispose(如组件本身实现了IDisposable)- Autofac可以在lifetime scope终止时也会自动处理这些组件特殊的Dispose。

    Container这个lifetime scope,在应用程序执行时会一直存在。所以,如果用Container来解析所有的组件的话,可以想象当应用程序终止时,Dispose将是多么繁忙的景象(所有的组件等待被Dispose),同样,因为直到最后一刻才会被Dispose,会更大几率引发“内存不足”这个问题。

    所以,推荐从Container创建一个新的lifetime scope来解析组件,在完成相关执行代码后,lifetime scope连带着组件即可被释放。

    (一旦你使用了Autofac integration libraries,创建和使用lifetime scope后就可以完全忘记它)

    对于我们的示例应用程序,我们将创建一个lifetime scope,然后解析出writer这个组件,并执行“writedate”方法。

    现在运行程序…

    • “writedate”方法要求一个idatewriter。
    • autofac看到idatewriter映射到TodayWriter,开始创建一个todaywriter。
    • autofac看到todaywriter需要ioutput来完成构造。
    • autofac看到ioutput映射到consoleoutput,所以创建一个新的consoleoutput实例。
    • autofac采用新consoleoutput实例完成建设TodayWriter。
    • autofac返回完全构成TodayWriter,可以开始执行“writedate”了。

    以后,如果你希望应用程序写另一个日期的话,可以实现一个不同的idatewriter然后改变登记程序的启动。你不需要改变其他的类。是的,这就是IOC(控制反转)!

    注意:一般来说,Service很大程度上被认为是一种反模式(看文章)。因此,在你的程序中人工创建scope并使用Container,这种方式不是最好的。使用“Autofac integration libraries”,你通常不需要像示例程序那样人工创建scope。当然,你如何设计应用程序取决于你自己。

    本篇结束。

    后述:完整的英文版链接在此:http://autofac.readthedocs.io/en/latest/getting-started/index.html,有部分内容没有翻译,也有部分内容自我感觉翻译的并不恰当。若你有意见和建议,可联系我。

    本博文属作者原创,首发于www.boxfun.net,除非特别声明,本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

    本博文属作者原创,首发于www.boxfun.net,除非特别声明,本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
  • 相关阅读:
    juicer
    了解Hypertable
    PHP中抽象类与接口的区别
    结对编程
    MySQL的分支
    ThinkPHP3.2.3学习笔记4---统计ThinkPHP3.2.3加载的文件
    对于多线程程序,单核cpu与多核cpu是怎么工作的
    IT行业技术及程序员相关网站荟萃
    参观中关村软件园二期小记
    旋转图css3
  • 原文地址:https://www.cnblogs.com/denny-duan/p/7067487.html
Copyright © 2020-2023  润新知