.Net 依赖注入总结(一)

本文介绍了依赖注入的概念,通过实例展示了如何通过接口实现类之间的解耦合,分别使用构造器注入和属性注入进行演示。同时,文章解释了控制反转的思想,指出依赖注入是其实现方式之一。最后,提到了依赖注入在实际开发中的便利性,如更换依赖类无需修改大量代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

随着项目规模增大,越来越多的类管理起来十分困难,并且呈现非常复杂的依赖关系,例如如下代码,调用A类的printf()需要实例化B类,而B类的GetName()方法又必须实例化C。

    class A
    {
	    public void printf(string name)
	    {
		    B b=new B(); //A依赖B
		    b.Name=name;
		    Console.WriteLine(b.GetName());
	    }
    }
    class B
    {
        public string Name{get;set;}
        public string GetName()
        {
            C c=new C(); //B依赖C
            return c.FormatName(Name);
        }
    }
    class C
    {
        public string FormatName(string name) //首字母大写,其他字母小写
        {
            string tmpstr=name.ToUpper();
            Char firstLetter=tmpstr[0];
            string res=name.ToLower().Substring(1,name.Length-1);
            return string.Concat(firstLetter,res);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            A a=new A();
            a.printf("wy");
        }
    }

以上代码毫无疑问非常差,类之间耦合关系过于紧密,一旦需要修改C类,A类和B类都要做出相应修改,十分不方便,因此依赖注入是一种不错的解决方案。


提示:以下是本篇文章正文内容,

一、依赖注入是什么?

1. 依赖注入是什么?

依赖注入就是将依赖对象通过某种方式(通常是接口)注入到被依赖对象中,由于是通过接口实现这种关系,所以依赖者和被依赖者没有直接关系,实现了解耦合。上面例子可以加上2个接口以实现类A和类B以及类B和类C之间的解绑。
常用的依赖注入由两种方式,构造器注入和属性注入

  • 其本质都是通过在依赖类中实现接口,通过接口将被依赖类注入到依赖类中。

A和B之间采用构造器注入,即在实例化A对象时将B类以IB接口的形式注入进去。
B和C之间采用set注入,即在实例化B对象时将C类以IC接口的形式set进去。

   class A
    {
        private readonly IB _iB;
        public A(IB iB) //在A的构造器中注入 IB
        {
            this._iB=iB;
        }
	    public void printf(string name)
	    {
            _iB.Name=name; //用IB代替B
		    Console.WriteLine(this._iB?.GetName());//如果_iB有实例则调用它的GetName方法
	    }
    }
    public interface IB
    {
        string Name{get;set;}
        string GetName();
    }
    class B:IB
    {
        public IC iC{set;get;} //set注入的接口,必须要加上set属性,因为需要赋值
        public string Name{get;set;}
        public string GetName()=>iC?.FormatName(this.Name);
    }
    public interface IC
    {
        string FormatName(string name);
    }
    class C:IC
    {
        public string FormatName(string name) //首字母大写,其他字母小写
        {
            string tmpstr=name.ToUpper();
            Char firstLetter=tmpstr[0];
            string res=name.ToLower().Substring(1,name.Length-1);
            return string.Concat(firstLetter,res);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            IC myIC=new C(); //myIC就是C的实例
            IB myIB=new B();//myIB就是B的实例
            (myIB as B).iC=myIC;//set注入
            A a=new A(myIB);//构造器注入
            a.printf("wy");
        }
    }

B类和C类的实例化移到A类外执行

如果需要C类需要被替换为D类,则只需要在D类中实现FormatName()方法,用时用new D()代替new C()即可,A类和B类代码都不用修改,非常省事。

2. 依赖注入和控制反转的区别

控制反转不是一种具体技术,而是一种思想。在传统创建对象的思想中,由程序员直接创建对象。而在控制反转思想中,程序员不直接创建对象,而是描述创建它们的方式,在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务,由容器根据配置文件创建对象。

依赖注入是实现了控制反转思想的一种技术。

总结

以上就是今天要讲的内容,本文仅仅简单介绍了原始依赖注入的方法,而微软和第三方提供了一些现成的容器,使依赖注入更加方便管理,这些内容在第二章讲解。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值