1. 程式人生 > 其它 >控制反轉(IOC)與依賴注入(DI)--第三方Autofac的.NET IoC框架使用

控制反轉(IOC)與依賴注入(DI)--第三方Autofac的.NET IoC框架使用

一、簡介:

1、什麼是控制反轉(IOC)

Ioc—Inversion of Control,即“控制反轉”,不是什麼技術,而是一種設計思想。傳統程式設計,我們直接在邏輯層通過new進行建立物件,是程式主動去建立依賴物件;而IoC是有專門一個容器來建立這些物件,即由Ioc容器來控制對 象的建立;

控制:容器控制資源、資料的獲取

反轉:容器把依賴物件注入到物件,物件只能被動的接收容器注入的資源等等,這種方式叫做反轉

例子:

(1)、傳統程式設計如圖,都是主動去建立相關物件然後再組合起來:

 

(2)、當有了IoC/DI的容器後,在客戶端類中不再主動去建立這些物件了:

 

 

2、什麼是依賴注入(DI)

DI—Dependency Injection,即“依賴注入”:元件之間依賴關係由容器在執行期決定,形象的說,即由容器動態的將某個依賴關係注入到元件之中。依賴注入的目的並非為軟體系統帶來更多功能,而是為了提升元件重用的頻率,併為系統搭建一個靈活、可擴充套件的平臺。

依賴注入:容器把物件或者元件需要的資料等等注入這種形式叫做依賴注入

3、IoC和DI由什麼關係呢?

其實它們是同一個概念的不同角度描述

4、優點

靈活性

   (1)、可以簡單的改變一個廣泛使用的介面的實現類

   (2)、改變檢索策略對於一個給定的類更簡單(例如移動服務從類路徑的JNDI樹)

  (3)、 在一個地方調價攔截器是簡單的(如新增一個攔截器與基於jdbc的快取DAO)

可讀性

  (1)、這些專案有一個統一的元件模型,而不是零散的。

  (2)、程式碼更加簡單。

可測試性

  (1)、當他們通過建構函式的時候依賴關係很容易取代。

  (2)、可維護性比較好並且便於進行單元測試

  (3)、更多的測試會導致更高的程式碼質量

 

二、Autofac第三方IOC框架: 

 

1、下載Get包

1)、Autofac 
(2)、Autofac.Extensions.DependencyInjection

 

2、名稱空間

using Autofac;

3、容器的實現

using Autofac;
using System;
using Yes.Manage.IService;
using Yes.Manage.Service; namespace Yes.Manage.ContainerService { public class Container { private static IContainer container = null;//建立、連線依賴項並管理一組元件的生存期。 public static ILifetimeScope BeginLifetimeScope() { if (container == null) { Initialise(); } return container.BeginLifetimeScope();//通過新作用域建立的元件例項 } public static void Initialise() { //容器構造器 var builder = new ContainerBuilder(); //註冊型別等等服務 builder.RegisterType<UserService>().As<IUserService>(); //構造容器 container = builder.Build(); } } }
4、UserService
using Modelsql.DbContexts;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Yes.Manage.IService;

namespace Yes.Manage.Service
{
    /// <summary>
    /// 倉儲,使用者相關資料操作
    /// </summary>
   public class UserService:IUserService
    {/// <summary>
        /// 查詢集合
        /// </summary>
        /// <returns></returns>
        public List<User> list() {
            return DbContext.User;
        }

    }
}
5、IUserService


using Modelsql.DbContexts;
using System;
using System.Collections.Generic;
using System.Text;

namespace Yes.Manage.IService
{
    public interface IUserService
    {/// <summary>
        /// 查詢集合
        /// </summary>
        /// <returns></returns>
        List<User> list();
    }
}

6、webapi介面

using Autofac;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Modelsql.DbContexts;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using WebAPI.API;
using Yes.Manage.ContainerService;
using Yes.Manage.IService;
using Yes.Manage.Service;


namespace iocc.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class DiController : ControllerBase
    {
       /// <summary>
        /// 獲取使用者集合
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public List<User> Subtract()
        {
            ResultMsg resultMsg = new ResultMsg() { StatusCode = 500, Info = "Success", Data = "" };
            using (var lifetimeScop = Container.BeginLifetimeScope())
            {
              IUserService userservice  = lifetimeScop.Resolve<IUserService>();//檢索IUserService服務的上下文獲取對應的例項
                var user = userservice.list();
                return user;
            }
        }
    }
}