因为客户类只依赖于服务类的一个接口,而不依赖于具体服务类,因此客户只定义一个注入点。在程序运行过程当中,客户类部直接实例化具体服务类实例,而是客户类的运行上下文环境或者专门组建负责实例化服务类,而后将其注入到客户类中,保证客户类的正常运行。函数
依赖注入的方法大体分为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(); } } }