1 构建应用程序

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

using System;

namespace AutofacDemo
{
public interface IOutput
{
void Write(string content);
} public class ConsoleOutput : IOutput
{
public void Write(string content)
{
Console.WriteLine(content);
}
}
}

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

 public interface IDateWriter
{
void WriteDate();
} public class CurentDateWriter :IDateWriter
{
IOutput _output;
public CurentDateWriter(IOutput output)
{
this._output = output;
} public void WriteDate()
{
this._output.Write(DateTime.Now.ToString());
}
}

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

using System;
namespace AutofacDemo
{
class Program
{
static void Main(string[] args)
{
IOutput ioutput = new ConsoleOutput();
IDateWriter idatewriter = new CurentDateWriter(ioutput); idatewriter.WriteDate(); Console.ReadKey();
}
}
}

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

2 引用Autofac

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

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

PM> install-package aufofac

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

using System;
using Autofac;
namespace AutofacDemo
{
class Program
{
static IContainer container { get; set; }
static void Main(string[] args)
{
var builder = new ContainerBuilder();
//注册 【组件类】 作为 【接口】 的实现
builder.RegisterType<ConsoleOutput>().As<IOutput>();
builder.RegisterType<CurentDateWriter>().As<IDateWriter>(); container = builder.Build(); //构建容器 //使用
IDateWriter datawriter = container.Resolve<IDateWriter>();
datawriter.WriteDate(); Console.ReadKey();
}
}
}

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

3  应用程序执行

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

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

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

using System;
using Autofac;
namespace AutofacDemo
{
class Program
{
static IContainer container { get; set; }
static void Main(string[] args)
{
var builder = new ContainerBuilder();
//注册 【组件类】 作为 【接口】 的实现
builder.RegisterType<ConsoleOutput>().As<IOutput>();
builder.RegisterType<CurentDateWriter>().As<IDateWriter>(); container = builder.Build(); //构建容器 //使用
using (var scope = container.BeginLifetimeScope())
{
IDateWriter datawriter = container.Resolve<IDateWriter>();
datawriter.WriteDate();
}
Console.ReadKey();
}
}
}

当执行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. Maven工程红色感叹号,且工程无红叉错误

    很可能是jar包不对,可以将maven库里的jar包删除,从 http://mvnrepository.com/ 根据jar包版本号下载到本地maven库,并在pom.xml里引入jar依赖 这次ja ...

  2. React.js 小书 Lesson11 - 配置组件的 props

    作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson11 转载请注明出处,保留原文链接和作者信息. 组件是相互独立.可复用的单元,一个组件可能在不 ...

  3. Object 公共方法详解

    在C#中,所有类型最终都从System.Object派生,所以每个类型的每个对象都保证了一组最基本的方法.具体地说,System.Object提供了一组公共实例方法. 一.Equals 如果两个对象具 ...

  4. Windows server 搭建ftp服务器

    1.安装ftp 2.端口端口21和20的入出端口 3.点击IIS 服务器证书 4.FTP界面上选择“FTP身份验证”——>“基本身份验证”–>”启用” 5.FTP界面选择 “FTP授权规则 ...

  5. FreeSwitch无法启动,提示进程pid锁定的解决方法

    来源:https://stackoverflow.com/questions/12817232/how-do-i-call-a-local-softphone-on-freeswitch error ...

  6. Cocos2d-js 开发记录:自定义按钮

    游戏开发总是有些特殊,一般的预制的UI无法满足要求.其实对于不复杂的功能,与其看文档还不如自己写一个.比如游戏中一个虚拟键盘,其中的按键在按下时会增长,变为原来的两倍高度,在原来高度上方显示按键的字如 ...

  7. OLEDB事务

    学过数据的人一般都知道事务的重要性,事务是一种对数据源的一系列更新进行分组或者批处理以便当所有更新都成功时同时提交更新,或者任意一个更新失败时进行回滚将数据库中的数据回滚到执行批处理中的所有操作之前的 ...

  8. CSS 面包屑导航栏

    做之前,先看一下效果图. demo01.png 首先,书写好 HTML 代码. <div id="crumbs"> <ul> <li><a ...

  9. Csharp:user WebControl Read Adobe PDF Files In Your Web Browser

    namespace GeovinDu.PdfViewer { [DefaultProperty("FilePath")] [ToolboxData("<{0}:Sh ...

  10. spark包

    spark-assembly-1.5.2-hadoop2.6.0.jar http://blog.csdn.net/ronaldo4511/article/details/53035494 http: ...