由于客户类只依赖于服务类的一个接口,而不依赖于具体服务类,所以客户只定义一个注入点。在程序运行过程中,客户类部直接实例化具体服务类实例,而是客户类的运行上下文环境或者专门组建负责实例化服务类,然后将其注入到客户类中,保证客户类的正常运行。
依赖注入的方法大致分为3中:接口注入、构造方法注入、setter注入;
1、setter注入
setter注入是指客户类中设置一个服务类接口类型的数据成员,并设置一个set方法作为注入点,这个set方法接收一个剧吐的服务类实例为参数,并将它赋给接口类型的数据成员。具体实例如下:
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());
}
}
}
2、构造函数注入
通过客户类的构造函数想客户注入服务类实例。
构造注入是指在客户类中,设置一个服务类接口的数据成员,并以构造函数为注入点,这个构造函数接收一个具体的服务类实例参数,并将它赋给服务类接口类型的数据成员。
具体代码实例如下:
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());
}
}
}
3、接口注入
接口是一种约束、是一种规范,具体实例代码如下:
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();
}
}
}