根据Martin Fowler撰写的论文,控制反转是程序控制流程被颠倒的原则:代替程序员控制程序流程,外部源(框架,服务,其他组件)控制它.这就像我们把东西塞进别的东西.他提到了一个关于EJB 2.0的例子:
例如,会话Bean接口定义ejbRemove,ejbPassivate(存储到辅助存储)和ejbActivate(从被动状态恢复).你无法控制何时调用这些方法,只是它们的作用.容器打电话给我们,我们不打电话给它.
这导致框架和库之间的区别:
控制反转是使框架与库不同的关键部分.库本质上是一组可以调用的函数,这些日子通常组织成类.每个调用都会执行一些操作并将控制权返回给客户端.
我认为,DI是IOC的观点,意味着对象的依赖性被颠倒了:相反,它控制着自己的依赖关系,生命周期......还有其他东西为你做.但是,正如你用手告诉我的DI,DI不一定是IOC.我们仍然可以有DI而没有IOC.
然而,在本文中(来自pococapsule,另一个IOC C/C++框架),它表明,由于IOC和DI,IOC容器和DI框架远远优于J2EE,因为J2EE将框架代码混合到组件中因此不能成为普通的旧Java/C++对象(POJO/POCO).
除依赖注入模式之外的控制容器的反转(存档链接)
附加阅读以了解旧的基于组件的开发框架的问题是什么,这导致了上面的第二篇论文:为什么以及什么是控制反转(存档链接)
我的问题:IOC和DI究竟是什么?我很迷惑.基于pococapsule,IOC比仅仅反转对象或程序员和框架之间的控制更重要.
可能重复:
控制反转<依赖注入
我总是在相同的上下文中读取IoC(控制反转)和DI(依赖注入).IoC和DI有什么区别?IoC与DI有何不同?
我已经阅读了很多关于依赖注入的文章以及观看了很多视频,但我仍然无法理解它.有没有人有一个很好的类比来解释它?
我看了敏捷秋播的第一部分截屏,但仍然有点困惑.
我感觉不存在控制倒置这样的事情,或者说正确的术语是依赖注入.我错了这个假设吗?
我一直试图为自己定义IoC.在这样做的过程中,我学到了很多关于IoC容器和依赖注入的知识.
刚才,我从Martin Fowler的网站上看到了这个:
结果我认为我们需要一个更具体的名称来模式.控制反转过于笼统,因此人们会发现它令人困惑.结果与各种IoC倡导者进行了大量讨论,我们选择了Dependency Injection这个名称.
在现代IoC世界中,依赖注入只是实现IoC的一种方式吗?
大概2个月我一直在阅读这三个主题我能找到的所有东西,我还不确定我是否已经找到了.
依赖倒置原则.意味着你应该始终只依赖于接口而不是它们的实现.如果你的班级依赖于任何其他班级,这是不好的,因为它取决于第二类的细节.如果你的类依赖于接口,这绝对可以,因为这种依赖只意味着你的类需要一些抽象的东西,它可以做一些具体的事情而你并不真正关心它的做法.
由于"DIP"中的P代表"原理",我应该用这种方式定义:依赖性倒置原则是一个原则,要求所有代码的实体仅依赖于他们真正需要的细节.
通过"他们真正需要的细节",我指的是最简单的情况下的接口.我还使用"实体"这个词来强调DIP也适用于程序和其他任何东西,不仅适用于类.
依赖注入.它仅适用于启用DI的实体.启用DI的实体是一个"开放"的实体,用于配置其行为而不更改其内部.注入有两种基本类型(在谈论类时):
因此,定义可能如下:依赖注入是将"抽象细节"传递给真正需要这些细节的实体的过程.
通过"真正需要这些细节",我指的是最简单的情况下的接口."实体"一词一如既往地用来强调DI也适用于程序和其他任何东西.
控制反转.它通常被定义为"库和框架之间的差异","以程序编程中的任何一种方式编写程序"等等.这对我来说是最令人困惑的事情.我认为这里的主要想法只是启动任何行动.要么"随时随地"(程序方式)做某事,要么"等"直到有人问你(IoC方式).
我的定义是:IoC是程序执行流程的一个属性,当你不要做任何事情,直到他们要求你这样做.
这听起来就像"好莱坞原则",但我相信"好莱坞原则"和IoC都是完全相同的想法.
我理解吗?
architecture theory dependency-injection inversion-of-control
我已经编程了一段时间但从未对理解每个概念的含义感兴趣,我可能正在使用各种编程概念,但却不知道它.
服务定位器:对我来说,是指通过减少代码量来加快开发速度的快捷方式记录.一个问题是:可能Locator仅引用名称空间/类,或者我可以拥有变量注册表?
以下是我对它的理解:
$locator = new ServiceLocator()
$locator->set('app', new System\Application());
$locator->set('db', new System\Pdo());
// Get the objects
$locator->get('db')->connect();
$locator->get('app')->run();
Run Code Online (Sandbox Code Playgroud)
依赖注入(和依赖注入容器):在对象内注入对象,无论工厂模式如何,都可以更快地访问这些对象.和DI容器?
以下是我对它的理解:
$app = new System\Application(System\Config::load());
Run Code Online (Sandbox Code Playgroud)
控制反转:不了解这种设计模式(或者理解但不知道我做的是IoC)
然后,在理论上(最好用简单的例子),这些概念中的每一个意味着什么?我是正确的,还是有什么不对/可以改进?
谢谢!
php design-patterns dependency-injection inversion-of-control service-locator
我问自己,外观模式是否违反了 SOLID 原则,以及模式本身是否是反模式。
更新
我的意见:
违反了OCP,因为你会在facade中添加更多的方法
LSP / ISP被违反,因为消费者/客户端有依赖,会有太多客户端不需要的方法。
DIP,在我看来,只要接口本身只公开抽象或 DTO,就不会被违反。
SOLID一般是我约的意见小,稳定,从而组合的接口。
一个门面往往是相反的大和不稳定。
ioc和依赖注入之间的区别.解释春天的依赖注入.什么是差异b/w JSF依赖注入和spring依赖注入..
IoC = 控制反转
DIP = 依赖倒置原理(SOLID 中的 D)
IoC == DIP?我想是这样的,确实如此。
构建软件的世界已经如此混乱,为什么还要用这么多词来表达同样的事情呢?
(我知道DI (依赖注入),它与DIP和IoC不同)
更新:
根据答案,我们可以说: ( DI ) + ( IoC ) = (依赖倒置原理) ?