今天趁着空闲总结一下自己IOC的一些理解,希望可以帮助到有需要的人,请大牛们多多指教。
(一)IOC
IOC就是控制反转,给程序解耦等等,有很多博客都对它做了一些很好的讲解。在这里我也不说太多文字,直接上代码吧。
定义了一个接口(服务)
public interface ITestProvider { string GetUser(string name); string GetId(string name); }
实现了这个接口
public class TestProvider:ITestProvider { private readonly string _userName; public TestProvider(string userName) { this._userName = userName; } public string GetUser(string name) { return this._userName; } public string GetId(string name) { return this._userName + "Id"; } }
定义了一个控制器使用上面的接口(TestController是一个组件,里面有对
public class TestController { private readonly string _userName; private readonly ITestProvider _testProvider; public TestController(ITestProvider testProvider, string userName){ this._userName = userName; this._testProvider = testProvider; } public string GetUser(string name){ return _testProvider.GetUser(name); } }
现在要使用TestController
ITestProvider testProvider =new TestProvider("zz"); //里氏转换原则 TestController testController=new TestController(testProvider,"ce"); Console.WriteLine(testController.GetUser("ss"));
//在写代码的时候,我们按照上面这种写法,我觉得问题也不是很大(再不是很大型的项目上)
//从上面这个例子中,我们可以看到这个最简单的道理。
//TestController,作为高层领导,要依赖于底层的ITestProvider。如果底层的ITestProvider一改变。那么高层领导也要跟着改。这就和我们现实生活中不符合了。下层员工牵着领导的鼻子走,显然领导就太没地位了。
//那现在领导肯定是不干的了,那么怎么让领导舒服一点呢。这个时候领导就去找个第三方的人(可能是秘书)来负责管理这些底层员工,自己和第三方有关系即可。其他事情都交给第三方。
//在我们编程也是一样的,高层TestController,为了好好管理底层,不让自己受到底层的牵连,所以就引入了IOC容器。
(二)IOC容器
控制反转容器使用上述原则(简而言之)管理类。也就是说,他们的创建,销毁,生命周期,配置和依赖关系。这样,类不需要获取和配置它们所依赖的类。这极大地减少了系统中的耦合,并因此简化了重用和可测试性。
(三) IOC的优缺点
优点上面已经说完了。下面讲讲缺点;
(1) 你要引入一个第三方,把系统变得复杂了一点。
(2) 引入一个第三方了,自己赚的也少了,所以说如果你系统不是很大,你引入第三方来管理的话,我觉得不是很合理的。如果你项目庞大,引入第三方还是非常有必要的。
(3) 到编程领域的话呢,就是一般都是通过XML文件来管理依赖的,所以你要把这个XML维护好。