当前位置: 首页 > 知识库问答 >
问题:

通过接口和项目结构进行依赖注入

刘成礼
2023-03-14

这个问题有点难解释,但我会尽力的。

我有一个项目,我必须制作一个从第三方服务获取数据的UI,并进行反序列化和一些线程管理工作。

现在我的项目结构在视觉工作室的一个解决方案下:

项目A:用户界面

项目B:从第三方服务获取数据的API

项目C:线程管理器API

注:项目B有一个IB接口,C有一个IC接口来帮助依赖注入。项目B和C将在未来被其他团队使用。

项目A同时使用IB和IC接口进行依赖注入。

现在我将陈述我对IOC的理解:DIP说高级模块不应该依赖于低级模块,高级和低级模块都应该依赖于抽象。如果要防止在更改低级模块时更改高级模块,则需要反转控制,以便低级模块不会控制高级模块所需的接口和对象的创建。

根据上述定义,IB和IC接口都应该在项目A中定义,对吗?如果他们在项目A中,那么其他团队将如何使用IB和IC接口?我是否需要另做一个单独的项目来存储接口?

共有2个答案

徐英锐
2023-03-14

根据上述定义,IB和IC接口都应该在项目A中定义,对吗?

不可以。你应该用“类”代替“模块”。在这种情况下,它开始变得更有意义:

高级[class]不应该依赖于低级[class],高级和低级[class]都应该依赖于抽象。

为了能够正确地进行依赖项注入,这些类和抽象位于哪个程序集中并不重要。当项目变得更大时(即数百万行代码,一个或多个团队在处理它),遵守组件设计的原则变得很重要。

在您的情况下,由于程序集A和B都使用接口IB,并且程序集A依赖于程序集B,IB永远不能位于程序集A中,因为这样会在程序集中形成循环引用。您必须将IB放入程序集B或a和B都引用的新程序集。

刘星火
2023-03-14

考虑下面的示例项目组织:

项目甲:引导器,负责运行应用程序,配置DI和设置用户界面(这也可以放在一个与应用程序和用户界面分离的专用引导器项目中)。知道B,C,D,E,F

项目B:用户界面(或使其模块化所需的尽可能多的项目)。知道C

项目C:业务逻辑(从第三方服务获取数据,并进行反序列化和一些线程管理工作)。知道D

项目D:接口,包含IB和IC(它们也可以有单独的专用项目)。

项目E:从第三方服务获取数据的API

项目F:线程管理器API知道D

注意到通过业务逻辑层与用户界面和实现的解耦。这样,您可以切换实现细节,而不必更改业务逻辑或用户界面。此外,如果您的业务逻辑发生变化,影响将最小化。

关于DI,bootstrapper项目是唯一一个完整的项目,其他项目应该只使用bootstrapper设置的容器将为它们解析(即注入)的接口。

 类似资料:
  • 是否可以将项目设置复制到另一个项目?,我想导出项目模块,依赖项,运行配置等。 如果IntelliJ做不到,有没有什么插件有这个功能?

  • 我想从基于xml的Spring配置切换到基于java的配置。对于构造函数类型注入,这很容易。我正在使用的示例: 但是,当我想通过setter方法注入时,我是这样做的: 我不确定这是否是注入基于Java的配置和setter方法的可能方法。不幸的是,我找不到任何示例(对于构造函数依赖项,存在很多示例)。另外,我不确定在基于Java的配置的情况下,我应该何时使用构造函数,何时使用setter。在Spri

  • 复合在这种情况下“消耗”一个子对象数组,从某种意义上说,“吸入”用密钥注册的IFoo的每个实现。这是一个重要的方面:如果您要用一个键注册复合,它将尝试实例化自己,并立即导致StackOverflow异常。 本机DI不支持这些命名注册。 这个例子是从这里提取的

  • 2.1 ABP公共结构 - 依赖注入 如果你已经了解依赖注入的概念、构造函数和属性注入模式,你可以跳过这一节。 维基百科:“依赖注入是一种软件设计模式,指一个或多个依赖(或服务)被注入,或通过引用传递,传入一个依赖对象(或客户端)并成为客户状态的一部分。模式通过自身的行为分离了客户依赖的创建,这允许程序设计是松耦合的,同时遵循依赖倒置和单一职责原则。与服务定位器模式直接进行对比,它允许客户了解他们

  • 在之前提到的多项目配置中,:libraries:lib1 和 :libraries:lib2 可以是 Java 项目,并且 :app 这个 Android 项目将会使用它们输出的 jar 包。然而,如果你想这部分代码能够访问 Android APIs 或者使用 Android 的资源,那么这些 Library 项目就不能是 Java 项目,只能是 Android Library 项目。

  • Gradle 项目可以依赖于其它组件,这些组件可以是外部二进制包,或者是其它的 Gradle 项目。