public void Test(ClassA a) { ClassB b=new ClassB(); b.method(); a.method2(); }

我想你应该都听过工厂模式,用使用servcie的形式将接口和其实现分开,客户端代码只调用接口。这样实现就可以独立的变化,而客户端代码不变。上面的代码可以重构成这样:
public void Test(IClassA a) { IClassB b=Factory.GetClassB(); b.method(); a.method2(); }
注意:上面的IClassA和IClassB都是抽象的接口。
依赖注入模式是一种控制反转的实现,那什么是控制反转呢?控制反转的意思是对象不直接创建它要完成某些功能所依赖的其它对象。相反的它通过外部来获取创建这些对象(比如:xml配置文件,其它框架api等等)。
采用依赖注入一个最大的特点是其中是没有对象直接介入的,一般情况是通过框架来对有构造函数的参数或者属性来注入相应的对象。
下面是通过一个高尔夫球员和俱乐部来说明这种场景。
从最高层级别来看,依赖注入的目的是这样的,一个高尔夫球球员需要加入一个俱乐部,这个可以用一个抽象的接口表示俱乐部(IClub),而他根本不关心到底是一个什么种类的俱乐部,也就是这个接口对应的具体实现类是哪一个,可能是WoodClub,IronClub,WedgeClub or PutterClub,到底是哪一个具体类呢?客户他根本不关心,只要返回一个功能正常能用的俱乐部就可以了。要实现这个,可以用Autofac,Ninject等ioc框架容器,而且借助ASP.NET mvc的提供给我们的Dependency Resolver可以允许我们在在其它的地方注册这种依赖关系,比如IClub是对应WoodClub。
用依赖注入和控制反转的好处:
1、减少类的耦合性
2、提高代码的重用性
3、提高代码的可维护性
4、提高代码的可测试性
注意:有时有人把依赖注入和抽象工厂比较,两者的细微的差别是依赖注入后面是有一个框架它通过查看我们注册的依赖有关系,更加需要框架自动调用通过调用其工厂生成我们需要的对象。
要看ASP.NET MVC中怎么实现依赖注入的可以参考:IoC实践--ASP.NET MVC5 采用Unity依赖注入Controller详解