zoukankan      html  css  js  c++  java
  • 【翻译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 国际许可协议进行许可。
  • 相关阅读:
    204. Count Primes (Integer)
    203. Remove Linked List Elements (List)
    202. Happy Number (INT)
    201. Bitwise AND of Numbers Range (Bit)
    200. Number of Islands (Graph)
    199. Binary Tree Right Side View (Tree, Stack)
    198. House Robber(Array; DP)
    191. Number of 1 Bits (Int; Bit)
    190. Reverse Bits (Int; Bit)
    189. Rotate Array(Array)
  • 原文地址:https://www.cnblogs.com/denny-duan/p/7067487.html
Copyright © 2011-2022 走看看