1 构建应用程序

示例: 我们期望有一个输出工具类,当前希望通过控制台(console)输出,但是又希望仅能在控制台模式下输出。所以我们把输出抽象为一个接口

  1. using System;
  2.  
  3. namespace AutofacDemo
  4. {
  5. public interface IOutput
  6. {
  7. void Write(string content);
  8. }
  9.  
  10. public class ConsoleOutput : IOutput
  11. {
  12. public void Write(string content)
  13. {
  14. Console.WriteLine(content);
  15. }
  16. }
  17. }

通过这个接口,我可以在控制台输出任意内容。 现在针对日期进行输出,我可以输出当前日期,明天,或者后天,或者…  我希望输出的日期很灵活。一个日期输出接口

  1. public interface IDateWriter
  2. {
  3. void WriteDate();
  4. }
  5.  
  6. public class CurentDateWriter :IDateWriter
  7. {
  8. IOutput _output;
  9. public CurentDateWriter(IOutput output)
  10. {
  11. this._output = output;
  12. }
  13.  
  14. public void WriteDate()
  15. {
  16. this._output.Write(DateTime.Now.ToString());
  17. }
  18. }

到此,我们的应用程序构建完毕,CurrentDateWriter 依赖 Ioutput 接口,并通过构造函数进行了注入。

  1. using System;
  2. namespace AutofacDemo
  3. {
  4. class Program
  5. {
  6. static void Main(string[] args)
  7. {
  8. IOutput ioutput = new ConsoleOutput();
  9. IDateWriter idatewriter = new CurentDateWriter(ioutput);
  10.  
  11. idatewriter.WriteDate();
  12.  
  13. Console.ReadKey();
  14. }
  15. }
  16. }

main 函数的调用代码,很明显对组件类(ConsoleOoutput 和 CurrentDateWriter) 形成了New 依赖。 接下来使用Autofac 实现依赖注入 (DI)

2 引用Autofac

打开项目,在管理Nuget程序包 中,输入aufofac  添加引用

也可以使用命令形式进行安装

PM> install-package aufofac

Autofac  需要一个 ContainerBuilder  来对 组件(实现类)和接口 进行注册,对外部调用代码,只暴露接口。Main 函数修改如下:

  1. using System;
  2. using Autofac;
  3. namespace AutofacDemo
  4. {
  5. class Program
  6. {
  7. static IContainer container { get; set; }
  8. static void Main(string[] args)
  9. {
  10. var builder = new ContainerBuilder();
  11. //注册 【组件类】 作为 【接口】 的实现
  12. builder.RegisterType<ConsoleOutput>().As<IOutput>();
  13. builder.RegisterType<CurentDateWriter>().As<IDateWriter>();
  14.  
  15. container = builder.Build(); //构建容器
  16.  
  17. //使用
  18. IDateWriter datawriter = container.Resolve<IDateWriter>();
  19. datawriter.WriteDate();
  20.  
  21. Console.ReadKey();
  22. }
  23. }
  24. }

我们把接口实例化的工作交给autofac 容器后,使用Idaewriter 输出日期时,就不用关心它的具体实现了。

3  应用程序执行

在应用程序执行期间,需要确保使用的组件已经被注册,而且是在一个生命周期内。autofac 容器有自己的生命周期, 不推荐直接从容器中取出一个组件。这等于直接new 了很多实例,然后等待系统自动释放。

推荐是在容器的生命周期范围内,获取一个组件时,为这个组件创建一个子生命周期。这样,当结束这个生命周期时,立即释放这个组件,避免内存堆积造成的内存泄露(memory leak)。

所以,我们改变我们上面的代码,附加一个使用范围

  1. using System;
  2. using Autofac;
  3. namespace AutofacDemo
  4. {
  5. class Program
  6. {
  7. static IContainer container { get; set; }
  8. static void Main(string[] args)
  9. {
  10. var builder = new ContainerBuilder();
  11. //注册 【组件类】 作为 【接口】 的实现
  12. builder.RegisterType<ConsoleOutput>().As<IOutput>();
  13. builder.RegisterType<CurentDateWriter>().As<IDateWriter>();
  14.  
  15. container = builder.Build(); //构建容器
  16.  
  17. //使用
  18. using (var scope = container.BeginLifetimeScope())
  19. {
  20. IDateWriter datawriter = container.Resolve<IDateWriter>();
  21. datawriter.WriteDate();
  22. }
  23.  
  24. Console.ReadKey();
  25. }
  26. }
  27. }

当执行WriteDate 方法时过程是这样:

  • WriteDate 方法向  autofac 容器请求一个 IDataWriter
  • autofac 发现 IDataWriter 映射到 CurrentDataWriter , 所以开始 实例化创建 CurrentDataWriter
  • autofac 发现 CurrentDataWriter  构造函数需要传递一个 IOutput 接口
  • autofac 发现 IOutput 映射到 ConsoleOutput 类,于是开始创建 ConsoleOutput  的实例
  • aufofac  用 ConsoleOutput   的实例 完成 CurrentDataWriter 实例的创建
  • aufofac 用 CurrentDataWriter  的实例 来构造 IDataWriter 接口

Autofac QuickStart的更多相关文章

  1. MVC 项目中又一新方法实现依懒注入 (AutoFac)

    详情请查看:http://docs.autofac.org/en/latest/integration/mvc.html#quick-start

  2. Autofac in webapi2

    安装包:Autofac.webapi2 注意: install-package autofac.webapi2 (注意:您的项目中如果使用的是webapi2,此处必须为webapi2而不是webapi ...

  3. autofac.webapi2

    quick start https://autofaccn.readthedocs.io/en/latest/integration/webapi.html#quick-start To get Au ...

  4. webform 下使用autofac

    官网介绍: http://docs.autofac.org/en/latest/integration/webforms.html#quick-start HTTP 错误 500.22 - Inter ...

  5. AutoFac在项目中的应用

    技能大全:http://www.cnblogs.com/dunitian/p/4822808.html#skill 完整Demo:https://github.com/dunitian/LoTCode ...

  6. Autofac - MVC/WebApi中的应用

    Autofac前面写了那么多篇, 其实就是为了今天这一篇, Autofac在MVC和WebApi中的应用. 一.目录结构 先看一下我的目录结构吧, 搭了个非常简单的架构, IOC(web), IBLL ...

  7. Autofac - 生命周期

    实例生命周期决定在同一个服务的每个请求的实例是如何共享的. 当请求一个服务的时候,Autofac会返回一个单例 (single instance作用域), 一个新的对象 (per lifetime作用 ...

  8. Autofac - 属性注入

    属性注入不同于通过构造函数方式传入参数. 这里是通过注入的方式, 在类创建完毕之后, 资源释放之前, 给属性赋值. 这里, 我重新弄一些类来演示这一篇吧. public class ClassA { ...

  9. Autofac 的点滴

    泛型类型的注册和使用 public interface IRepository<T> where T:class { } public interface ISchoolDetailRep ...

随机推荐

  1. Root用户让其他用户运行某程序

    这里以启动tomcat为例 1.安装tomcat不介绍了,自己百度 2.测试能否使用,略 3.创建tomcat用户 useradd tomcat -s /sbin/nologin 创建tomcat,禁 ...

  2. java里面的package/import 和PHP里面的namespace/use 是一模一样的吗

    java里面的package/import 和PHP里面的namespace/use 是一模一样的吗? java: php package mypage; namespace mypage; impo ...

  3. HDU 1069—— Monkey and Banana——————【dp】

    Monkey and Banana Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  4. Linux kernel workqueue机制分析

    Linux kernel workqueue机制分析 在内核编程中,workqueue机制是最常用的异步处理方式.本文主要基于linux kernel 3.10.108的workqueue文档分析其基 ...

  5. oracle 报错:ORA-02019 未找到数据库的连接说明

    一.问题描述 我之前连的是别的数据库,现在更换了数据库的连接,然后就报了如下的错误: 我使用的是NHibernate,我找到映射文件后发现我用了dblink,代码中table="COM_OR ...

  6. embedded tomcat运行java web,Unable to compile class for JSP

    环境 eclipse:4.5.2 jre:1.8 java project compiler:1.8 embedded tomcat:7.0.32 可以正常启动,但是访问时,会报错. HTTP Sta ...

  7. flask在centos下搭建web服务【uwsgi,nginx】

    centos操作系统 uWSGI是一个web服务器,Nginx进行反向代理的其实跟这些服务器可以说没有任何关系,你提供动态内容的服务器可以是apache/nginx/tomcat,当然也可以是uWSG ...

  8. 了解WaitForSingleObject中WAIT_ABANDONED 返回值

    1.互斥量内核对象 互斥量内核对象用来确保一个线程独占对一个资源的访问.互斥量对象包含一个使用计数.线程ID以及递归计数.互斥量与关键段的行为完全相同.但是互斥量是内核对象,而关键段是用户模式下的同步 ...

  9. mac的svn

    http://xclient.info/s/cornerstone.html?t=c5242a66e53f1d866afe8c42aace2738c04ce9ee#versions 破解版的地址 打开 ...

  10. SharePoint - Templates & Definitions

    1. <ListTemplate>元素的SecurityBits属性 Optional Text. Defines the item-level permissions in the li ...