.Net 依赖注入总结(一)
前言
随着项目规模增大,越来越多的类管理起来十分困难,并且呈现非常复杂的依赖关系,例如如下代码,调用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. 依赖注入和控制反转的区别
控制反转不是一种具体技术,而是一种思想。在传统创建对象的思想中,由程序员直接创建对象。而在控制反转思想中,程序员不直接创建对象,而是描述创建它们的方式,在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务,由容器根据配置文件创建对象。
依赖注入是实现了控制反转思想的一种技术。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了原始依赖注入的方法,而微软和第三方提供了一些现成的容器,使依赖注入更加方便管理,这些内容在第二章讲解。