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. HRBUST 1161——Leyni——————【线段树单点更新,区间查询】

    Leyni Time Limit: 3000 MS Memory Limit: 65536 KB 64-bit integer IO format: %lld , %llu Java class na ...

  2. C# 面试题二

    1.        请编程实现一个冒泡排序算法? int [] array = new int [*] ; ; ; i < array.Length - ; i++) { ; j < ar ...

  3. linux服务器git pull/push时避免频繁输入账号密码

    1.先cd到根目录,执行git config --global credential.helper store命令 [root@iZ25mi9h7ayZ ~]# git config --global ...

  4. CentOS初使用命令总结

    最近买了一台aliyun(ECS服务器)用来学习使用,初次使用难免要走弯路.遇到一些问题好长时间解决不了,结果经人指点豁然开朗.于是乎,总结了一些新生上路经验. 首先要解决的问题是:通过PuTTY.S ...

  5. 【学习笔记】String进阶:StringBuffer类(线程安全)和StringBuilder类

    一.除了使用String类存储字符串之外,还可以使用StringBuffer类存储字符串.而且它是比String类更高效的存储字符串的一种引用数据类型. 优点: 对字符串进行连接操作时,使用Strin ...

  6. HTML代码中<%%>、<%=%>、<%:%>

    <%%>之间可以写服务器端代码 比如 <% for(var i=0;i<10;i++){%> <%=%>获取后台的变量值,比如后台一个session[&quo ...

  7. 纯CSS的三角符号

    项目中经常用到三角形,现在给大家讲下用纯CSS写的下三角实心图形 .triangle{ border-width: 5px 4px 0 4px; border-color: #454A7B trans ...

  8. 类的方法练习——定义MySQL类

    要求: 1.对象有id.host.port三个属性 2.定义工具create_id,在实例化时为每个对象随机生成id,保证id唯一 3.提供两种实例化方式,方式一:用户传入host和port 方式二: ...

  9. CRM——起步

    一.CRM简介 crm 客户关系管理软件 ( Customer Relationship Management ). 二.CRM起步 1.设计表结构和数据库迁移 from django.db impo ...

  10. 2729:Blah数集

    2729:Blah数集 查看 提交 统计 提问 总时间限制: 3000ms 内存限制: 65536kB 描述 大数学家高斯小时候偶然间发现一种有趣的自然数集合Blah,对于以a为基的集合Ba定义如下: ...