一步步到IOC
程序员文章站
2022-04-15 08:17:04
一段代码 问题 依赖具体Log4NetServices,要换成FileLogServices就要改 依赖 依赖就是 变形: 这样在实际使用中,不用管ILogServices的实现,由Shop的构造函数负责给具体实现 问题 Shop本身也不知道是用Log4NetServices还是FileLogSer ......
一段代码
class program { static void main(string[] args) { var shop=new shop(); shop.add(); shop.delete(); console.readkey(); } } class shop { readonly log4netservices _logservices; public shop() { _logservices = new log4netservices(); } public void add() { _logservices.write("增加商品"); } public void delete() { _logservices.write("删除商品"); } }
问题
- 依赖具体log4netservices,要换成filelogservices就要改
依赖
依赖就是依赖抽象
变形:
readonly ilogservices _logservices;
这样在实际使用中,不用管ilogservices的实现,由shop的构造函数负责给具体实现
问题
- shop本身也不知道是用log4netservices还是filelogservices,但使用者肯定是知道的。
注入
注入就是将你需要的东西传给你,不用你自己new
变形:
class program { static void main(string[] args) { var shop=new shop(new log4netservices()); shop.add(); shop.delete(); shop=new shop(new filelogservices()); shop.add(); shop.delete(); console.readkey(); } } class shop { readonly ilogservices _logservices; public shop(ilogservices logservices) { _logservices = logservices; } public void add() { _logservices.write("增加商品"); } public void delete() { _logservices.write("删除商品"); } }
问题:
- 需要的人多了,我一个个new?
- 需要的种类多了,我一个个new?
- 能不能把new的东西放一起,需要的人统一从里面拿。
ioc
dotnetcore 的ioc示例
class program { static void main(string[] args) { var servicecollection = new servicecollection(); servicecollection.addsingleton<ilogservices, log4netservices>(); var serviceprovider = servicecollection.buildserviceprovider(); var logservices = serviceprovider.getservice<ilogservices>(); var shop = new shop(logservices); shop.add(); shop.delete(); console.readkey(); } }