博客一:
https://blog.csdn.net/sinat_21843047/article/details/80297951
博客二:通过接口来理解依赖注入与控制反转
https://www.cnblogs.com/zhaopei/p/5078539.html
DAO:
public class DaoMySql
{
public int add(string str)
{
//...省略具体实现
return 1;
}
//...省略具体实现,如修改 删除 查询
}
Impl:
public class AddStudentImpl
{
DaoMySql mysql= null;
public AddStudentImpl()
{
mysql= new DaoMySql ();
}
public int addStudent()
{
string str = ""; //...省略具体实现
return mysql.add(str);
}
}
注意:mysql这个对象是由AddStudentImpl类主动创造
的
UI:
public class UI
{
AddStudentImpl s = new AddStudentImpl();
public UI()
{
s.addStudent();
}
}
应该说简单得不能在简单的三层。
就在系统用了一年之后,老板说:”听说oracle很牛逼,大公司都是用的oracle。咱们也换上吧。“。 好,那就换吧。于是就要写一个DaoOracle类 还要修改BLL类,还要修改UI类,非常的麻烦! 这得想一个好的办法。
首先,我们定义一个数据访问接口。
public interface ISqlHelper
{
int add();
//...省略具体实现,如修改 删除 查询
}
Dao修改如下:
public class DaoMySql interface:ISqlHelper
{
public int add(string str)
{
//...省略具体实现
return 1;
}
//...省略具体实现,如修改 删除 查询
}
public class DaoOracle interface:ISqlHelper
{
public int add(string str)
{
//...省略具体实现
return 1;
}
//...省略具体实现,如修改 删除 查询
}
Impl修改如下:
public class AddStudentImpl
{
ISqlHelper sql= null;
public AddStudentImpl(ISqlHelper sql )
{
this.sql = sql;
}
public int addStudent()
{
string str = ""; //...省略具体实现
return sql .add(str);
}
}
UI:
public class UI
{
public UI()
{
ISqlHelper sqlhelper = new DaoOracle();
AddStudentImpl s = new BLLAddStudentImpl(sqlhelper);
s.addStudent();
}
}
在之后如果想要更改数据库更换需求,则只用更改UI层即可。Impl层是完全不用改变的。
这里的UI对于Impl来说就是“依赖注入”,Impl对于UI来说就是“控制反转”。
Impl类原来由自己主动
new一个对象,而更改以后则由UI层来将对象注入给Impl层,Impl层被动
的接受对象。由主动变为被动,这就是控制反转
。UI层有点类似于Spring的IOC容器