Ninject 学习,IoC 容器
- 松耦合
在理想情况下,每个组件都不了解其他组件的存在,而只是通过抽象接口来处理应用程序的其他区域,这成为“松耦合”。
PasswordResetHelper IEmailSender MyEmailSender public class PasswordResetHelper { public void ResetPassword(){ IEmailSender mySender = new MyEmailSender(); //...调用接口方法 mySender.SendEmail(); } }- 依赖注入
上面代码更糟糕的是PasswordResetHelper 依赖于IEmailSender和MyEmailSender。 此时需要的是一种获取实现给定接口对象的方法,而不必直接创建这个实现对象。这一问题的解决方案是依赖注入(DI,Dependency Injection),也称为控制反转(IoC, Invesion of Control)。
public class PasswordResetHelper { private IEmailSender emailSender; public PasswordResetHelper(IEmailSender emailSenderParam) { emailSender = emailSenderParam; } public void ResetPassword(){ //...调用接口方法 mySender.SendEmail(); } }- IoC 容器
以上代码已解决依赖性问题,在运行时把依赖性注入到类的构造器之中。但还有一个问题需要解决–如何实例化接口的具体实现,而无需在应用程序的某个地方创建依赖性。 DI 容器就是在需要依赖性的类和这些依赖性的具体实现之间担任中间人的一个组件。
