原文:http://www.bkjia.com/Asp_Netjc/888119.html  【原文中有一个地方报错,下面已修改】

一.基本步骤:

1.设计适合控制反转(IoC)的应用程序

2.给应用程序Autofac 引用.

3.注册组件.

4.创建一个Container以备后用.

5.从Container创建一个 lifetime scope .

6.使用这个Lifetime Scope 来解析组件的实例.

二.详细介绍:

1.什么是控制反转?

  控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题。 控制反转还有一个名字叫做依赖注入(Dependency Injection)。简称DI。IoC就是IoC,不是什么技术,与GoF一样,是一种 设计模式

  Interface Driven Design接口驱动,接口驱动有很多好处,可以提供不同灵活的子类实现,增加代码稳定和健壮性等等,但是接口一定是需要实现的,也就是如下语句迟早要执行:AInterface a = new AInterfaceImp(); 这样一来,耦合关系就产生了;而采用了IoC之后,我们的就把创建接口的一个实例交给IoC容器.从而实现了解耦.

所以我们在编程的时候的原则之一就是"针对接口编程",这里的"接口"不是指一要是个接口类型,它可以是C#语言中的接口类型,也可以一个具体的父类.

   public interface  ILcService
{
string ServiceName { get; }
} public class LcService:ILcService
{ public string ServiceName
{
get;
set;
}
}

2.怎么添加Autofac的引用?

1)我们可以到Autofac官网下载dll文件,然后在Visualstudio的项目中添加引用

2)也可以使用NuGet 安装autofac包.

3.怎样注册组件?

  在Autofac中,我们使用一个ContainerBuilder类的实例来注册我们的我们的组件. Autofac提供了Register方法家族,方便我们注册组件.

            ContainerBuilder builder = new ContainerBuilder();

            //builder.RegisterType<ILcService>().As<LcService>().InstancePerDependency();
//此处报错: The type 'AutofacIocApp.ILcService' is not assignable to service 'AutofacIoc’
//原文中注册顺序写反了, An IDynamicQuery is not a DynamicQuery but a DynamicQuery IS an IDynamicQuery.
    builder.RegisterType<LcService>().As<ILcService>().InstancePerDependency();

4.创建一个Container以备后用.
直接调用ContainerBuilder类实例的build()即可.

    var container = builder.Build();

5.创建一个Lifetime Sope.

      var lifetimescope = container.BeginLifetimeScope();

6.得到我们需要的的实例.

        ILcService service = lifetimeScope.Resolve<ILcService>();     

  我们可以在最后看的出来,使用了IoC之后,就符合设计模式中要求的"针对接口编程,不针对实现编程";创建实例不是使用New关键字创建,而是创建实例的工作交给了IoC容器,这就实现了关系解耦,可以在IoC容器中随便的替换具体的实现类了.

    还有个问题就是"为什么不直接从Container中直接解析出具体的实例,而要创建一个LifetimeScope,再从它里面解析?"

   这个就是考虑到内存泄露问题.  LifetimeScope用完了,就释放了,它里面的实例也跟着释放了,就不会出现内存泄露,Container是个root ,永远不会释放,如果他里面存在实例.就有可能存在内存泄露问题.

Autofac IoC容器基本使用步骤【1】的更多相关文章

  1. 自己实现IOC容器,java代码实现简易版IOC容器,IOC容器实现的步骤分解

    一.需求 实现一个简易的IOC容器,管理Bean,从IOC容器的BeanFactory中获取实例,从而取代自己new实例的做法. 二.实现步骤分析 三.具体代码实现 自定义注解类 MyComponen ...

  2. Autofac IoC容器基本实战【2】

    原文:http://www.cnblogs.com/liping13599168/archive/2011/07/16/2108209.html Autofac是一款IOC框架,比较于其他的IOC框架 ...

  3. IoC容器Autofac学习笔记

    一.一个没有使用IoC的例子 IoC的全称是Inversion of Control,中文叫控制反转.要理解控制反转,可以看看非控制反转的一个例子. public class MPGMovieList ...

  4. SpringBoot启动流程分析(四):IoC容器的初始化过程

    SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...

  5. IoC容器Autofac(5) - Autofac在Asp.net MVC Filter中的应用

    Autofac结合EF在MVC中的使用,上一篇IoC容器Autofac(4) - Autofact + Asp.net MVC + EF Code First(附源码)已经介绍了.但是只是MVC中Co ...

  6. Ioc容器Autofac系列(1)-- 初窥

     一.前言 第一次接触Autofac是因为CMS系统--Orchard,后来在一个开源爬虫系统--NCrawler中也碰到过,随着深入了解,我越发觉得Ioc容器是Web开发中必不可少的利器.那么,Io ...

  7. AutoFac使用~IOC容器(DIP,IOC,DI)

    #cnblogs_post_body h1 { background-color: #A5A5A5; color: white; padding: 5px } Autofac一款IOC容器,据说比Sp ...

  8. IoC容器Autofac - Autofac + Asp.net MVC + EF Code First(转载)

    转载地址:http://www.cnblogs.com/JustRun1983/archive/2013/03/28/2981645.html  有修改 Autofac通过Controller默认构造 ...

  9. IOC容器 - Autofac概述

    Autofac是比较出名的Ioc容器之一,熟悉Orchard的应该熟知.本文直接介绍autofac用法 一.开始 1.NuGet添加或者直接http://code.google.com/p/autof ...

随机推荐

  1. taro 打包微信小程序运行失败(一)

    1.报错信息 thirdScriptError sdk uncaught third Error Cannot read property 'createTextNode' of undefined ...

  2. OpenERP7.0中非admin帐号新增其它用户问题

    在OpenERP7.0中,通过admin新增了一个管理员帐号,然后登录管理员帐号,再新增其它用户时提示错误,系统提示对users没有create权限. 经测试了解,是因为安装了多公司模块后,在记录规则 ...

  3. MySQL实现允许远程用户登录(使用Navicat for MySQL工具)

    一.方式一和方式二都可以,建议方式二. 前提条件:在服务器上将MySQL的配置文件 /etc/mysql/my.cnf中使用: sudo vi /etc/mysql/my.cnf 找到bind-add ...

  4. MySQL —— 如何快速对比数据?

    我们在MySql中想要对比下两个不同的实例上的数据并且找出差异,除了主键之外我们还要对比每一个字段,应该怎么做呢? 方案一:写一个程序将两个实例里面的每一行数据都分别取出来对比,但是耗时我们无法估计, ...

  5. webservice调用的四种方式

    因为数据在网络上传输都是通过xml形式的,本质都是把数据封装然后通过xml传输,接收到的也是xml文件,1 和 4 让程序员屏蔽了处理xml文件,而2 和3需要程序员自己写请求体 ,还要处理返回的xm ...

  6. perl: warning: Setting locale failed.

    本篇文章由:http://xinpure.com/perl-warning-setting-locale-failed/ 将 mac 系统切换成英文后,使用 git 命令出现如下错误: perl: w ...

  7. LeetCode-2: Add Two Numbers

    [Problem:2-Add Two Numbers] You are given two non-empty linked lists representing two non-negative i ...

  8. [Linux]--解决虚拟机中安装ubuntu不能自适应的问题

    这几天换了新的电脑,但是装上ubuntu mate以后就一直不能自适应窗口大小改变分辨率,奈何我是个强迫症,再加上也不想老师带着自己的笔记本跑动跑西的(主要是太重了...),于是今天花了一下午的时间找 ...

  9. Mysql 创建表和删除表

    在数据库中创建一张表的基本语法如下: CREATE TABLE tablename (column_name_1 column_type_1 constraints, column_name_2 co ...

  10. Atitit.分布式远程调用  rpc  rmi  CORBA的关系

    Atitit.分布式远程调用  rpc  rmi  CORBA的关系 1. 远程调用(包括rpc,rmi,rest)1 2. 分布式调用大体上就分为两类,RPC式的,REST式的1 3. RPC(远程 ...