首页 文章

体系结构:放置不依赖于任何其他服务或存储库组件的服务类的位置

提问于
浏览
3

考虑具有存储库层(持久性),服务层(应用程序)和Web(UI)层的Web应用程序 .

考虑一个组件(即ExternalProgramExecutor),它不是UI组件,不依赖于服务或存储库层中的任何组件 .

问题是:

  • 此组件是否属于服务层?

  • 该组件是否属于持久层?

  • 它应该与这些层分开处理吗?如果是这样,这部分架构的名称是什么?

9 回答

  • 4

    问自己以下问题:

    • 它持续存在吗?

    • 是否提供服务?

    • 这些东西是否与您的应用程序特别相关?

    第一个问题的答案应该是否定的,因为您已经告诉我们组件没有以任何方式挂钩到应用程序 .

    第二个问题的答案应该是肯定的,因为这是所有优秀软件组件提供的:某种服务 .

    但是任何有 Value 的灵活组件应该在软件应用程序的任何地方运行良好,所以真正的问题是:你应该在哪里放置组件,以便最忠实地保存您的Web架构?

    毕竟,Web架构只是一种组织机制 . 如果你're trying to find the answer in The One True Web Architecture Reference™, you' re doing it wrong .

  • 0

    就个人而言,我会在问题列表中添加另一个问题@Robert问:

    • 它完全独立于我的申请吗?

    对我来说,我通常在我的架构中添加一个新的Utility / Framework组件,这是我完全独立的组件,可以在以后的其他应用程序中重用 .

  • 0

    根据DDD,这种服务 - 似乎可以与"Util/Helper"服务同化 - 应该在"Infrastructure Layer"(src:InfoQ

    体系结构典型的企业应用程序体系结构由以下四个概念层组成:用户界面(表示层):负责向用户呈现信息并解释用户命令 . 应用层:此层协调应用程序活动 . 它不包含任何业务逻辑 . 它不保存业务对象的状态,但它可以保持应用程序任务的进度状态 . 域层:此层包含有关业务域的信息 . 业务对象的状态保存在此处 . 业务对象的持久性以及可能的状态被委托给基础结构层 . 基础架构层:此层充当所有其他层的支持库 . 它提供层之间的通信,实现业务对象的持久性,包含用户界面层的支持库等 .

  • 1

    鉴于你的问题的限制,我会问你的独立组件的目的是什么?它主要是围绕某些数据的外观(它会使其成为持久层的一部分),还是应用程序(应用程序层)的域或业务逻辑或工作流的一部分?像外部任务 Actuator 这样的东西,我倾向于认为它将是你的应用程序层的一部分 .

  • 0

    从概念上讲,'ExternalProgramExecutor'看起来像一个服务,因此它属于服务层 .

    要了解服务层的详细信息,有两种可能性:

    • 服务'ExternalProgramExecutor'与其他服务具有相同的性质,因此它是服务层的's another '项目符号点,

    • 该服务与其他服务有很大不同,它是服务层的's another '块 .

    这种脱节与更实用的观点(实施)保持一致:

    • 该服务依赖于相同的功能(相同的UI,对持久性的相同访问权限):它应该与服务层的其他部分集成,以使用它们的API ...

    • 该服务本质上是独立的:'s a chance, don' t创建不必要的依赖关系,独立开发它 .

  • 0

    我倾向于将服务视为您的域模型上的接口,并且因为听起来这种关系不存在,所以它听起来不像是一种服务 .

    您的持久层调解与数据存储的通信,但听起来这个组件没有多少内容在那里做 .

    那么它属于哪个层?它真的需要属于一个吗?通过询问这些问题,听起来你已经花时间正确地组织对象了 . 如果您有一个无关的组件,您可以:

    A)将其放入最常使用的层中

    B)将它放入自己的组件中,不再担心标记它:)

  • 0

    多层(软件)架构使用不同的层来分配应用程序的职责,因此我们有:

    • 责任分离 .

    • 易于查看工作流程 .

    • Ability to replace layers implementation with minimum effort-side effects.

    从第3点开始,如果更改"ExternalProgramExecutor"不需要在其他图层上进行 any 更改 . 我想这应该为自己一层 . 我在具有类似用途的项目上使用了一个名为"Ext"的图层 .

    如果更改需要任何更改,请将其添加到需要修改的图层 .

    希望能帮助到你 .

  • 0

    好吧, ExternalProgramExecutor 本身就是一项服务,因为您的应用程序将此作为外部组件使用 .

    显然,如果您不打算将该组件的 source code 作为应用程序项目的一部分,则无法将该服务放入您的应用程序中 . 因此,您实际上将在项目中使用该服务/组件 Gateway . 为了使它成为 SOLID ,您的网关将是抽象的,您的问题是您应该从中引用该抽象网关的地方 .

    答案完全取决于ExternalProgramExecutor(以及网关)提供的功能类型以及项目如何使用该功能 . 从应用程序的顶层到底层(DAL - > ... - > UI),而抽象功能不是图层的一部分 . 找到正确的图层后,使用该图层中的网关,底层不应该知道运行时具体网关的存在 .

相关问题