zoukankan      html  css  js  c++  java
  • AutoFac使用~IOC容器(DIP,IOC,DI)

      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配置文件的节点用途都是一样的,另外还有属性注入和方法两种模式,感兴趣的可以自行研究。

  • 相关阅读:
    OpenStack概述、虚拟机部署OpenStack
    foo bar 的典故
    PWA
    react 虚拟dom心得
    背包问题总结
    leetcode 44 通配符匹配(dp)
    黑客与画家
    njuoj 递归查询字符串
    我的第一篇博客
    接口测试入门(二)
  • 原文地址:https://www.cnblogs.com/caoshiqing/p/6094693.html
Copyright © 2011-2022 走看看