既然说在控制反转中获取资源的过程叫做依赖注入,那么这里代码实现也是专注于依赖注入。IoC实现的方式由两种: 依赖获取和依赖注入。

接下来就细看依赖注入和依赖获取。

 

三 . 依赖注入背景及定义 

 

     (http://blog.csdn.net/commandbaby/article/details/51578699)

   3.1. 背景

          随着面向对象分析与设计的发展,一个良好的设计,核心原则之一就是将变化隔离,使得变化部分发生变化时,不变部分不受影响(OCP)。为了做到这一点,要利用面向对象中的多态性,使用多态性后,客户类不再直接依赖服务类,而是依赖一个抽象的接口,这样,客户类就不能在内部直接实例化具体的服务类。但是,客户类在运行中又客观需要具体的服务类提供服务,因为接口是不能实例化去提供服务的。就产生了“客户类不准实例化具体服务类”和“客户类需要具体服务类”这样一对矛盾。为了解决这个矛盾,开发人员提出了一种模式:客户类定义一个注入点,用与服务类的注入,而客户类的客户类负责根据情况,实例化服务类,注入到客户类中,从而解决了这个矛盾。

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

 

   3.2. 依赖注入类型

        3.2.1. Setter注入

        定义:是指在客户类中,设置一个服务类接口类型的数据成员,并设置一个Set方法作为注入点,这个Set方法接受一个具体的服务类实例为参数,并将它赋给服务类接口类型的数据成员。

 控制反转(Ioc)和依赖注入(DI)整理(二)(含代码示例)

 

图3.1 Setter注入示意

 

    实例代码如下:  构建了一个服务类接口(IStudentInj),和两个实现接口的服务类(StudentA,StudentB). 定义了一个客户类GetStudentInfo.

    服务类接口(IStudentInj)的代码如下:

 public interface IStudentInj
    {
        void StudentName();
    }

 

 两个服务类代码如下:

public class StudentA :IStudentInj
    {
        public void StudentName()
        {
            Console.WriteLine("I am student A!");
        }
    }


public class StudentB : IStudentInj
    {
        public void StudentName()
        {
            Console.WriteLine("I am student B!");
        }
    }

 

 客户类代码:

 public class GetStudentInfo
    {
        IStudentInj stu;

        public void SetStudent(IStudentInj student)
        {
            this.stu = student;   
        }

        public void GetStudentName()
        {
            stu.StudentName();
        }
    }
View Code

相关文章:

  • 2021-12-09
  • 2022-02-21
  • 2022-01-02
  • 2021-07-25
  • 2022-02-16
猜你喜欢
  • 2021-06-03
  • 2021-06-04
  • 2021-06-23
  • 2022-02-04
  • 2022-12-23
  • 2021-09-23
  • 2022-12-23
相关资源
相似解决方案