Autofac一款IOC容器,据说比Spring.Net、Unity、Castle性能高,且比较轻量级,也有人做过测试,自己可以找找,看看比拼的结果是怎样的,在使用Autofac之前我们先来了解几个概念;在我看来依赖倒置(DIP)、控制反转(IOC)、 依赖注入(DI),都源于一个思想,一项技术,思想就是面向接口编程,技术就是反射。

通常我们在编程的时候呢,类与类之间都有着这样那样的关系,没有关系的类,也就说明它没有存在的必要了;那么对于复杂的系统来讲,类之间的关系也会变的更复杂,如果需求发生变化,那将是改死人的节奏,那么如何降低依赖关系,提高系统的扩展性,就非常重要了,也就是我们经常说的解耦。

依赖倒置

依赖倒置原则:

  1. 上层模块不应该依赖下层模块,它们共同依赖于抽象
  2. 抽象不依赖于具象,具象依赖抽象

上层是使用者,下层是被使用者,如果下层发生变化那么上层也要进行修改,那么该怎么办呢,就是上层和下层共同依赖于一个抽象,那么抽象是稳定的,上层也就不需要修改了。

控制反转

通常我们在编程的时候,都是使用者需要什么对象就实例化一个对象,现在有这么一个场景,比如我们的系统之前用的是SqlServer,现在需要也支持MySql,那么业务逻辑层也需要改动很多。

现在利用控制反转我们可以将实例化对象交给IOC容器来实现,这样使用者就不需要改动了,用一句话来总结就是:

使用者不再实例化被使用者对象,而交给IOC容器来实现

依赖注入

就是由IoC容器在运行期间,动态地将某种依赖关系注入到对象之中。

这些概念已经有很多文章了,不了解的童鞋可以移步这里http://www.cnblogs.com/qqlin/archive/2012/10/09/2707075.html

Autofac(IOC容器)

那么我们该如何使用这款轻量级且高效的框架呢,本文示例使用的是Autofac 4.2.0版本,上代码

首先需要通过nuget安装Autofac和Autofac.Configuration组件

/// <summary>
/// 数据访问接口
/// </summary>
public interface IDataAccess
{
string GetData();
} /// <summary>
/// 从sqlserver获取接口
/// </summary>
public class SqlServer : IDataAccess
{
public string GetData()
{
return "从sqlserver获取数据";
}
} /// <summary>
/// 从Mysql获取数据
/// </summary>
public class MySql : IDataAccess
{
public string GetData()
{
return "从mysql获取数据";
}
} /// <summary>
/// 数据源管理类
/// </summary>
public class DBBase
{
IDataAccess _access; /// <summary>
/// 根据传入的类型动态创建对象
/// </summary>
/// <param name="access"></param>
public DBBase(IDataAccess access)
{
_access = access;
} public string GetData()
{
return _access.GetData();
}
}

构造参数注入

var builder = new ContainerBuilder();

#region 构造函数注入

//通过autofac api注册组件
//注册DbBase类型
builder.RegisterType<DBBase>();
//注册类型并指定使用哪个构造函数
//builder.RegisterType<DBBase>().UsingConstructor();
//注册类型及其实例,注册接口IDataAccess的实例SqlServer
builder.RegisterType<SqlServer>().As<IDataAccess>(); #region 为一个接口注册多个不同实例
//builder.RegisterType<SqlServer>().Named<IDataAccess>("SqlServer");
//builder.RegisterType<MySql>().Named<IDataAccess>("Mysql");
//使用这种方式注册时,在实例化对象的时候需要使用
//container.ResolveNamed<IDataAccess>("SqlServer")
#endregion #region 使用XML文件注册组件
//使用之前先在NuGet中安装Microsoft.Extensions.Configuration.Xml才能使用AddXmlFile方法
var config = new ConfigurationBuilder();
config.AddXmlFile("config/autofac.xml", false);
var module = new ConfigurationModule(config.Build());
builder.RegisterModule(module);
//如果文件路径找不到的话可以用//config.SetBasePath(directory.Parent.Parent.FullName);来设置配置文件所在目录
#endregion #region 使用JSON文件注册组件
//在NuGet中安装Microsoft.Extensions.Configuration.Json才能使用AddJsonFile方法
var config = new ConfigurationBuilder();
config.SetBasePath(directory.Parent.Parent.FullName);
config.AddJsonFile("config/autofac.json");
var module = new ConfigurationModule(config.Build());
builder.RegisterModule(module);
#endregion #endregion //构建IOC容器 using (var container = builder.Build())
{
var access = container.Resolve<DBBase>();
Console.WriteLine(access.GetData());
}
Console.Read();

所用到的配置文件如下:

config/autofac.xml

<?xml version="1.0" encoding="utf-8" ?>
<!--defaultAssembly 默认的命名空间;如果type节点或者services节点的属性type没有设置类所在命名空间的话,将默认在defaultAssembly下查找类,type节点和services节点的属性type设置格式为MyType,MyAssembly".-->
<autofac defaultAssembly="AutofacDemo">
<components name="0">
<type>AutofacDemo.MySql,AutofacDemo</type>
<services name="0" type="AutofacDemo.IDataAccess,AutofacDemo" />
<injectProperties>true</injectProperties>
<!--是否启用组件的属性注入-->
</components>
</autofac>

config/autofac.json

{
"defaultAssembly": "AutofacDemo",
"components": [
{
"type": "AutofacDemo.SqlServer,AutofacDemo",
"services": [
{
"type": "AutofacDemo.IDataAccess,AutofacDemo"
}
],
"injectProperties": true
}
]
}

json配置文件和xml配置文件的节点用途都是一样的,另外还有属性注入和方法两种模式,感兴趣的可以自行研究。

AutoFac使用~IOC容器(DIP,IOC,DI)的更多相关文章

  1. ASP.NET Core 3.1 IOC容器以及默认DI以及替换Autofac生命周期

    IOC 就是我们需要一个对象 以前我们是去 new 现在我们是直接向 IOC容器 要我们需要的那个对象. 使用一个IOC容器(autofac)通过依赖注入控制各个组件的耦合.也就是说你写好了组件,不需 ...

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

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

  3. IOC,DIP,DI,IoC容器

    定义 IOC(Inversion of Control  控制反转),DIP(Dependency Inverson Principle 依懒倒置)都属于设计程序时指导原则,并没有具体的实现.比较常用 ...

  4. 一个由正则表达式引发的血案 vs2017使用rdlc实现批量打印 vs2017使用rdlc [asp.net core 源码分析] 01 - Session SignalR sql for xml path用法 MemCahe C# 操作Excel图形——绘制、读取、隐藏、删除图形 IOC,DIP,DI,IoC容器

    1. 血案由来 近期我在为Lazada卖家中心做一个自助注册的项目,其中的shop name校验规则较为复杂,要求:1. 英文字母大小写2. 数字3. 越南文4. 一些特殊字符,如“&”,“- ...

  5. ASP.NET中IOC容器Autofac(依赖注入DI 控制反转IOC)

    IOC的一个重点是在程序运行中,动态的向某个对象提供它所需要的其他对象.这一点是通过DI来实现的.Autofac则是比较流行的一款IOC容器. IoC和DI有什么关系呢?其实它们是同一个概念的不同角度 ...

  6. 详解依赖注入(DI)和Ioc容器

    简单的来说,关键技术就是:注册器模式. 场景需求 我们知道写一个类的时候,类本身是有个目的的,类里面有很多方法,每个方法搞定一些事情:我们叫这个类为主类. 另外这个主类会依赖一些其他类的帮忙,我们叫这 ...

  7. Spring ioc容器

    一.ioc容器 ioc (inversion of  control)即控制反转,把某一个接口选择实现类的控制权转移给Spring容器来管理.调用类对该实现类的依赖关系由ioc容器注入(DI),传统的 ...

  8. 控制反转(Ioc)和依赖注入(DI)

    控制反转IOC, 全称 “Inversion of Control”.依赖注入DI, 全称 “Dependency Injection”. 面向的问题:软件开发中,为了降低模块间.类间的耦合度,提倡基 ...

  9. Spring 中 IoC 容器简介

    IoC 是一种通过描述来生成或者获取对象的技术,可以说 Spring 是一种基于 IoC 容器编程的框架 在一个系统中可以生成各种对象,并且这些对象都需要进行管理.为了描述这些对象关系,我们需要一个容 ...

  10. Spring源码解析-IOC容器的实现

    1.IOC容器是什么? IOC(Inversion of Control)控制反转:本来是由应用程序管理的对象之间的依赖关系,现在交给了容器管理,这就叫控制反转,即交给了IOC容器,Spring的IO ...

随机推荐

  1. $inArray()总是返回-1

    $inArray(val,arr)注意val类型和arr中的是否一致 如1 和"1" 就会返回-1

  2. android View事件分发机制结论

    原始博客有对源码的分析:http://blog.csdn.net/lmj623565791/article/details/39102591 结论:1.view事件的分发流程: dispatchTou ...

  3. c#调用c++动态链接库的问题

    1. Server Error in '/' Application. Object reference not set to an instance of an object. 这个问题是接口中的方 ...

  4. E:Sudoku

    总时间限制: 2000ms 内存限制: 65536kB描述Sudoku is a very simple task. A square table with 9 rows and 9 columns ...

  5. Windows Store App 插值动画

    插值动画支持DoubleAnimation.ColorAnimation和PointAnimation类型的动画.其中比较常用的是DoubleAnimation动画,它可以用来控制界面元素的Doubl ...

  6. Windows Store App 近期访问列表

    Windows 8系统在管理用户的文件时,会将用户近期访问的文件添加到对应应用的近期访问列表中,所有的Windows应用商店应用都有各自的近期访问列表,根据文件的上一次访问时间,可以在列表中对文件进行 ...

  7. ios 尺寸

    pre iPhone5 Default.png (320x480px) – "iPhone Portrait iOS5,6 – 1x" Default@2x.png (640x96 ...

  8. 美女程序员是如何将QQ转换成题目中那串数字的--读博文《找女神要QQ号码》

    我只能说好好的端午节你们不约么?,还在这里写代码?我也是够无聊的,下班了不走也在这跟风写着玩!<找女生要QQ号码原文>原文链接http://www.cnblogs.com/iforever ...

  9. iOS开发UI篇—在UIImageView中添加按钮以及Tag的参数说明

    ios开发UI篇—在ImageView中添加按钮以及Tag的参数说明 一.tag参数 一个视图通常都只有一个父视图,多个子视图,在开发中可以通过使用子视图的tag来取出对应的子视图.方法为Viewwi ...

  10. iOS开发拓展篇—CoreLocation地理编码

    iOS开发拓展篇—CoreLocation地理编码 一.简单说明 CLGeocoder:地理编码器,其中Geo是地理的英文单词Geography的简写. 1.使用CLGeocoder可以完成“地理编码 ...