C#中依赖注入

Wesley13
• 阅读 516

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

依赖注入的方法大致分为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();
        }
    }
}
点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
spring使用@Autowired为抽象父类注入依赖
有时候为了管理或者避免不一致性,希望具体服务统一继承抽象父类,同时使用@Autowired为抽象父类注入依赖。搜了了网上,有些解决方法实现实在不敢恭维,靠子类去注入依赖,那还有什么意义,如下:父类:publicabstractclassBaseCar{Settingssettings;}@Co
Stella981 Stella981
3年前
SpringBoot学习:整合shiro自动登录功能(rememberMe记住我功能)
首先在shiro配置类中注入rememberMe管理器!复制代码(https://oscimg.oschina.net/oscnet/675f5689159acfa2c39c91f4df40a00ce0f.gif)/cookie对象;rememberMeCookie()方法是设置Cookie的生成模
Stella981 Stella981
3年前
AutoFac
 一、前言  AutoFac是.NET平台下的一款著名的IoCContainer,它可以让我们很轻松的解除项目中服务类的接口与客户类的接口实现类之间的依赖关系,从而降低系统各模块之间耦合程度以提高系统的稳定性。最近在做毕业设计,在开发中采用了autofac来进行依赖注入,这里是对踩到的一些坑的解决方法,希望可以给同样不幸进入这些坑中的童鞋们提供
Easter79 Easter79
3年前
SpringBoot学习:整合shiro自动登录功能(rememberMe记住我功能)
首先在shiro配置类中注入rememberMe管理器!复制代码(https://oscimg.oschina.net/oscnet/675f5689159acfa2c39c91f4df40a00ce0f.gif)/cookie对象;rememberMeCookie()方法是设置Cookie的生成模
Stella981 Stella981
3年前
Noark入门之注入方式
普通类注入只要是被IOC容器接管的类可以当作属性注入.@AutowiredprivateVipServicevipService;接口注入如果有被IOC容器接管的类实现了此接口,也可以作属性一样注入实现类.@AutowiredprivateVipExportService
Wesley13 Wesley13
3年前
Spring学习总结(5)——IOC注入方式总结
一、构造注入在类被实例化的时候,它的构造方法被调用并且只能调用一次。所以它被用于类的初始化操作。<constructorarg是<bean标签的子标签。通过其<value子标签可以为构造方法传递参数。现在以一个简单的输出学生信息的实例演示如何为构造方法传递参数。实例程序创建过程如下。(1)建立Student接口,
Easter79 Easter79
3年前
Spring实战第四版笔记
一、Spring的功能底层一般都依赖于它的两个核心特性:依赖注入(DI)、面向切面编程(AOP)。  (1)依赖注入(DI)    背景:在一些有实际应用的类中都会有两个或者更多的类组成,这些类相互之间进行协作来完成特定的业务逻辑。按照传统的做法,每个对象负责管理与自己相互协作的对象(即它所依赖的对象,一般是使用new来创建对象)的引用,这
Easter79 Easter79
3年前
Spring常用的三种注入方式
Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三种:构造方法注入,setter注入,基于注解的注入。构造方法注入先简单看一下测试项目的结构,用maven构建的,四个包:entity:存储实体,里面只有一个User类dao:数据访问,一个接口,两个实现类service:服务层,一个接口,一个
Easter79 Easter79
3年前
Spring两种依赖注入方式的比较
我们知道,Spring对象属性的注入方式有两种:设值注入和构造注入。先看代码:  假设有个类为People,该对象包含三个属性,name和school还有age,这些属性都有各自的setter和getter方法,还有一个包含这三个属性的构造方法。如果用spring来管理这个对象,那么有以下两种方式为People设置属性:  1.设值注入:
Wesley13 Wesley13
3年前
Spring方法注入
在spring中注入方式有3中:1,构造函数注入2,set方法注入3,接口注入(方法注入)在spring中的bean默认范围都是单例,但是在特定的情况下,我们需要有如下的业务需要,单例bean1需要依赖非单例bean2,由于bean1始终是单例,所以如果不做出改变,每次获取的bean2也是同一个,容器就没办法给我们提供