C#中依赖注入

由于客户类只依赖于服务类的一个接口,而不依赖于具体服务类,所以客户只定义一个注入点。在程序运行过程中,客户类部直接实例化具体服务类实例,而是客户类的运行上下文环境或者专门组建负责实例化服务类,然后将其注入到客户类中,保证客户类的正常运行。

依赖注入的方法大致分为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}
点赞
收藏

评论区

加载中...

相关推荐

sql注入

反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o

spring使用@Autowired为抽象父类注入依赖

有时候为了管理或者避免不一致性,希望具体服务统一继承抽象父类,同时使用@Autowired为抽象父类注入依赖。搜了了网上,有些解决方法实现实在不敢恭维,靠子类去注入依赖,那还有什么意义,如下:父类:publicabstractclassBaseCar{Settingssettings;}@Co

SpringBoot学习:整合shiro自动登录功能(rememberMe记住我功能)

首先在shiro配置类中注入rememberMe管理器!复制代码(https://oscimg.oschina.net/oscnet/675f5689159acfa2c39c91f4df40a00ce0f.gif)/cookie对象;rememberMeCookie()方法是设置Cookie的生成模

AutoFac

 一、前言  AutoFac是.NET平台下的一款著名的IoCContainer,它可以让我们很轻松的解除项目中服务类的接口与客户类的接口实现类之间的依赖关系,从而降低系统各模块之间耦合程度以提高系统的稳定性。最近在做毕业设计,在开发中采用了autofac来进行依赖注入,这里是对踩到的一些坑的解决方法,希望可以给同样不幸进入这些坑中的童鞋们提供

SpringBoot学习:整合shiro自动登录功能(rememberMe记住我功能)

首先在shiro配置类中注入rememberMe管理器!复制代码(https://oscimg.oschina.net/oscnet/675f5689159acfa2c39c91f4df40a00ce0f.gif)/cookie对象;rememberMeCookie()方法是设置Cookie的生成模

Noark入门之注入方式

普通类注入只要是被IOC容器接管的类可以当作属性注入.@AutowiredprivateVipServicevipService;接口注入如果有被IOC容器接管的类实现了此接口,也可以作属性一样注入实现类.@AutowiredprivateVipExportService