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

  Autofac一款IOC容器,聽說比Spring.Net、Unity、Castle性能高,且比較輕量級,也有人作過測試,本身能夠找找,看看比拼的結果是怎樣的,在使用Autofac以前咱們先來了解幾個概念;在我看來依賴倒置(DIP)、控制反轉(IOC)、 依賴注入(DI),都源於一個思想,一項技術,思想就是面向接口編程,技術就是反射。html

一般咱們在編程的時候呢,類與類之間都有着這樣那樣的關係,沒有關係的類,也就說明它沒有存在的必要了;那麼對於複雜的系統來說,類之間的關係也會變的更復雜,若是需求發生變化,那將是改死人的節奏,那麼如何下降依賴關係,提升系統的擴展性,就很是重要了,也就是咱們常常說的解耦。mysql

依賴倒置

依賴倒置原則:sql

  1. 上層模塊不該該依賴下層模塊,它們共同依賴於抽象
  2. 抽象不依賴於具象,具象依賴抽象

上層是使用者,下層是被使用者,若是下層發生變化那麼上層也要進行修改,那麼該怎麼辦呢,就是上層和下層共同依賴於一個抽象,那麼抽象是穩定的,上層也就不須要修改了。編程

控制反轉

一般咱們在編程的時候,都是使用者須要什麼對象就實例化一個對象,如今有這麼一個場景,好比咱們的系統以前用的是SqlServer,如今須要也支持MySql,那麼業務邏輯層也須要改動不少。json

如今利用控制反轉咱們能夠將實例化對象交給IOC容器來實現,這樣使用者就不須要改動了,用一句話來總結就是:api

使用者再也不實例化被使用者對象,而交給IOC容器來實現框架

依賴注入

 就是由IoC容器在運行期間,動態地將某種依賴關係注入到對象之中。函數

這些概念已經有不少文章了,不瞭解的童鞋能夠移步這裏http://www.cnblogs.com/qqlin/archive/2012/10/09/2707075.htmlsqlserver

Autofac(IOC容器)

  那麼咱們該如何使用這款輕量級且高效的框架呢,本文示例使用的是Autofac 4.2.0版本,上代碼post

首先須要經過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配置文件的節點用途都是同樣的,另外還有屬性注入和方法兩種模式,感興趣的能夠自行研究。

相關文章
相關標籤/搜索