IOC容器违反了OOP原则
IOC容器的目的是什么?合并的原因可以简化为以下内容: 当使用OOP / SOLID开发原则时,依赖注入会变得混乱。您可能具有顶层入口点,这些入口点管理着位于其自身下方的多个级别的依赖关系,并通过构造递归传递依赖关系,或者您在工厂/构建器模式和接口中有一些重复的代码,可以根据需要构建依赖关系。 没有OOP / SOLID方式可以执行此操作并拥有超级漂亮的代码。 如果上述陈述是正确的,那么IOC容器该如何做?据我所知,他们没有采用手动DI无法完成的未知技术,因此唯一的解释是IOC容器通过使用静态对象私有访问器来打破OOP / SOLID原则。 IOC容器是否在幕后打破了以下原则?这是真正的问题,因为我有很好的理解,但是感觉到其他人有更好的理解: 范围控制。范围是我对代码设计做出几乎所有决定的原因。块,本地,模块,静态/全局。范围应该非常明确,在块级别尽可能多,而在静态级别则尽可能少。您应该看到声明,实例化和生命周期的结尾。只要我明确指出,我相信该语言和GC可以管理范围。在我的研究中,我发现IOC容器将大多数或所有依赖项设置为静态,并通过幕后的一些AOP实现对其进行控制。所以没有什么是透明的。 封装。封装的目的是什么?我们为什么要保留私人会员呢?出于实际原因,因此我们的API的实现者无法通过更改状态(应由所有者类管理)来破坏实现。但是,出于安全原因,也不会发生注入超过我们的成员国并绕过验证和类控制的情况。因此,在编译之前以某种方式注入代码以允许外部访问私有成员的任何东西(模拟框架或IOC框架)都非常庞大。 单一责任原则。从表面上看,IOC容器似乎使事情更清洁。但是想象一下,如果没有帮助程序框架,您将如何完成相同的任务。您将传递带有十几个依赖项的构造函数。这并不意味着用IOC容器将其掩盖,这是一件好事!这是重构代码并遵循SRP的标志。 打开/关闭。就像SRP并非仅是类一样(我将SRP应用于单一职责范围,更不用说方法了)。打开/关闭不仅是不更改类代码的高级理论。这是一种了解程序配置并控制要更改和扩展的内容的实践。IOC容器可以部分地完全更改类的工作方式,因为: 一种。主要代码没有确定切换出依赖项,而是框架配置。 b。范围可以在不受调用成员控制的时间进行更改,而是由静态框架在外部确定。 因此,该类的配置不是真正封闭的,它会根据第三方工具的配置自行更改。 这是一个问题,是因为我不一定是所有IOC容器的大师。尽管IOC容器的想法不错,但它们似乎只是掩盖了糟糕的实现的外观。但是,为了完成外部Scope控制,私有成员访问和延迟加载,必须进行许多非平凡的可疑事情。AOP很棒,但是通过IOC容器完成AOP的方式也值得怀疑。 我可以相信C#和.NET GC可以完成我期望的工作。但是我不能再信任第三方工具来改变我的已编译代码,以执行我无法手动执行的操作的变通办法。 EG:实体框架和其他ORM创建强类型对象并将其映射到数据库实体,并提供样板功能来执行CRUD。任何人都可以建立自己的ORM,并继续手动遵循OOP / SOLID原则。但是这些框架对我们有帮助,因此我们不必每次都重新发明轮子。看来,IOC容器可以帮助我们有目的地围绕OOP / SOLID原则开展工作并加以掩盖。