由于客户类只依赖于服务类的一个接口,而不依赖于具体服务类,所以客户只定义一个注入点。在程序运行过程中,客户类部直接实例化具体服务类实例,而是客户类的运行上下文环境或者专门组建负责实例化服务类,然后将其注入到客户类中,保证客户类的正常运行。
依赖注入的方法大致分为3中:接口注入、构造方法注入、setter注入;
1、setter注入
setter注入是指客户类中设置一个服务类接口类型的数据成员,并设置一个set方法作为注入点,这个set方法接收一个剧吐的服务类实例为参数,并将它赋给接口类型的数据成员。具体实例如下:
1using System; 2using System.Collections.Generic; 3using System.Text; 4 5namespace ConsoleApp1.SetterInjection 6{ 7 interface IServiceClass 8 { 9 string ServiceInfo(); 10 } 11 12 13 internal class ServiceClassA:IServiceClass 14 { 15 public string ServiceInfo() => "类A"; 16 } 17 internal class ServiceClassB:IServiceClass 18 { 19 public string ServiceInfo() => "类B"; 20 } 21 internal class ClientClass 22 { 23 private IServiceClass _serviceClass; 24 public void Set_Service(IServiceClass service) 25 { 26 this._serviceClass = service; 27 } 28 public void ShowInfo() 29 { 30 Console.WriteLine(_serviceClass.ServiceInfo()); 31 32 } 33 } 34}
2、构造函数注入
通过客户类的构造函数想客户注入服务类实例。
构造注入是指在客户类中,设置一个服务类接口的数据成员,并以构造函数为注入点,这个构造函数接收一个具体的服务类实例参数,并将它赋给服务类接口类型的数据成员。
具体代码实例如下:
1using System; 2using System.Collections.Generic; 3using System.Text; 4 5namespace ConsoleApp1.SetterInjection 6{ 7 interface IServiceClass 8 { 9 string ServiceInfo(); 10 } 11 12 13 internal class ServiceClassA:IServiceClass 14 { 15 public string ServiceInfo() => "类A"; 16 } 17 internal class ServiceClassB:IServiceClass 18 { 19 public string ServiceInfo() => "类B"; 20 } 21 22 internal class ClientClassInjection 23 { 24 private IServiceClass _service; 25 public ClientClassInjection(IServiceClass service) => _service = service; 26 public void ShowInfo() 27 { 28 Console.WriteLine(_service.ServiceInfo()); 29 } 30 } 31}
3、接口注入
接口是一种约束、是一种规范,具体实例代码如下:
1using System; 2using System.Collections.Generic; 3using System.Text; 4 5namespace ConsoleApp1.IOC 6{ 7 //硬盘接口 8 interface IHardDisk 9 { 10 string Name { get; }//硬盘的名字属性 11 void Read();//读数据方法 12 void Write(string str);//写数据方法 13 } 14 internal class HardDisk200 : IHardDisk 15 { 16 public string Name { get => "200G内存的硬盘"; } 17 18 public void Read() 19 { 20 Console.WriteLine("我可以写入数据。。。。。。。"); 21 } 22 23 public void Write(string str) 24 { 25 Console.WriteLine(str); 26 } 27 } 28 29 30 internal class HardDisk1T:IHardDisk 31 { 32 public string Name => "1T内存的硬盘"; 33 public void Read() 34 { 35 Console.WriteLine("我可以写入数据。。。。。。。"); 36 } 37 38 public void Write(string str) 39 { 40 Console.WriteLine(str); 41 } 42 } 43 44 45 public class Test 46 { 47 public static void test() 48 { 49 IHardDisk hardDisk = new HardDisk200(); 50 hardDisk.Read(); 51 hardDisk.Write(hardDisk.Name + "我可以写入数据"); 52 Console.Read(); 53 } 54 } 55}