控制反轉(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; } } } }