架构,改善程序复用性的设计~第五讲 复用离不开反射和IOC续(大白话IOC)
要研究的问题:IOC是什么?它解决了什么?我们的项目中为何要用IOC?反射对性能真的影响很大吗?不用反射,谁意见最大?
来吧,开始说问题
1,IOC是什么?不用说什么容器,框架,大白话其实IOC就是将一些接口与它的各种实现的类名配置在一个文件中,可以是XML,也可以是.config配置文件中,然后在程序“运行时”去根据配置的信息去动态得到(resolved)这个对象,然后程序中就可以使用这个对象了,所IOC就是用来建立对象的。
2,它解决了什么?一个接口,有三种实现,如sql实现,oracle实现,access实现等,那当前环境下用哪种方式来进行实现呢,这时可以由IOC来实现它。
1 // 统一规范 2 public interface IRepository<TEntity> where TEntity : class 3 { 4 void Insert(TEntity entity); 5 } 6 7 // sql 实现 8 public class SqlRepository<TEntity> : IRepository<TEntity> 9 { 10 public void Insert(TEntity entity) 11 { 12 ... 13 } 14 } 15 16 // Access实现 17 public class AccessRepository<TEntity> : IRepository<TEntity> 18 { 19 public void Insert(TEntity entity) 20 { 21 ... 22 } 23 }
3,我们的项目中为何要用IOC?在项目中用IOC的目的很简单,就是让程序松耦合,说的有点抽象,看一个小代码
1 class UserService 2 { 3 var userRepository=new UserRepository(); 4 }
我们可以看到userRepository对象它依赖于UserRepository的实现,当我们需要改变userRepository的实现方法时,很困难,只能去代码中改变,这样导致程序的扩展性很低,这是项目中引入IOC的原因,也就是说:“当程序模块有多种实现方式时,可以引用IOC方式来创建对象的实例”。
4,反射对性能真的影响很大吗?这个问题有无数个人做了无数次实验,反射和不用反射的程序,差距不好确定,因为它与数据复杂度还有关系,一般数据量小时,可能几十倍,数据量时,可能上百倍(反射在底层实现时),我们可以从微软的原码中看到,它在一些时候使用了很多反射,是的,我本人不反对使用反射,因为我是一个面向对象的忠实信仰者。
5,不用反射,谁意见最大?这个问题很有意思,谁意见最大?我看因为是“面向对象”意见最大,因为我们无法去想像一个没有反射的程序是如何面向对象的,当一个需求被更改时,就要去修改你的程序代码,这对于程序员是一种痛苦,也违背了面向对象的原则,我想,即然C#是一个完全面向对象的语言,那我们在写程序时,是否应该面向对象更多一些,而不是那么一点点的性能,而且这种性能的浪费我认为是完成值得的。
信仰C#,信仰面向对象
感谢各位!