因爲客戶類只依賴於服務類的一個接口,而不依賴於具體服務類,因此客戶只定義一個注入點。在程序運行過程當中,客戶類部直接實例化具體服務類實例,而是客戶類的運行上下文環境或者專門組建負責實例化服務類,而後將其注入到客戶類中,保證客戶類的正常運行。函數
依賴注入的方法大體分爲3中:接口注入、構造方法注入、setter注入;this
一、setter注入spa
setter注入是指客戶類中設置一個服務類接口類型的數據成員,並設置一個set方法做爲注入點,這個set方法接收一個劇吐的服務類實例爲參數,並將它賦給接口類型的數據成員。具體實例以下:code
using System; using System.Collections.Generic; using System.Text; namespace ConsoleApp1.SetterInjection { interface IServiceClass { string ServiceInfo(); } internal class ServiceClassA:IServiceClass { public string ServiceInfo() => "類A"; } internal class ServiceClassB:IServiceClass { public string ServiceInfo() => "類B"; } internal class ClientClass { private IServiceClass _serviceClass; public void Set_Service(IServiceClass service) { this._serviceClass = service; } public void ShowInfo() { Console.WriteLine(_serviceClass.ServiceInfo()); } } }
二、構造函數注入接口
經過客戶類的構造函數想客戶注入服務類實例。內存
構造注入是指在客戶類中,設置一個服務類接口的數據成員,並以構造函數爲注入點,這個構造函數接收一個具體的服務類實例參數,並將它賦給服務類接口類型的數據成員。get
具體代碼實例以下:string
using System; using System.Collections.Generic; using System.Text; namespace ConsoleApp1.SetterInjection { interface IServiceClass { string ServiceInfo(); } internal class ServiceClassA:IServiceClass { public string ServiceInfo() => "類A"; } internal class ServiceClassB:IServiceClass { public string ServiceInfo() => "類B"; } internal class ClientClassInjection { private IServiceClass _service; public ClientClassInjection(IServiceClass service) => _service = service; public void ShowInfo() { Console.WriteLine(_service.ServiceInfo()); } } }
三、接口注入it
接口是一種約束、是一種規範,具體實例代碼以下:io
using System; using System.Collections.Generic; using System.Text; namespace ConsoleApp1.IOC { //硬盤接口 interface IHardDisk { string Name { get; }//硬盤的名字屬性 void Read();//讀數據方法 void Write(string str);//寫數據方法 } internal class HardDisk200 : IHardDisk { public string Name { get => "200G內存的硬盤"; } public void Read() { Console.WriteLine("我能夠寫入數據。。。。。。。"); } public void Write(string str) { Console.WriteLine(str); } } internal class HardDisk1T:IHardDisk { public string Name => "1T內存的硬盤"; public void Read() { Console.WriteLine("我能夠寫入數據。。。。。。。"); } public void Write(string str) { Console.WriteLine(str); } } public class Test { public static void test() { IHardDisk hardDisk = new HardDisk200(); hardDisk.Read(); hardDisk.Write(hardDisk.Name + "我能夠寫入數據"); Console.Read(); } } }