【问题标题】:Clean Architecture - How to handle usecase dependencies清洁架构 - 如何处理用例依赖项
【发布时间】:2020-12-12 23:26:28
【问题描述】:

我正在重构我的一个旧应用程序,以使用用例“干净架构”的概念。 我对如何利用通用数据和实体验证有点困惑

例如有2个用例

  • 允许管理员导入新的工作流模板
  • 允许管理员创建新的工作流模板

以上用例是从控制器中调用的。

在上述两种情况下,都有一些常见的数据库级别验证,例如:

  • 是否已有同名的工作流?

要处理这些验证,我是否将其作为单独的用例,如“checkIfWorkflowWithSameNameExists()”?

如果我制作一个单独的用例,那么调用这些常见验证的最佳选项是什么

  1. 一个用例可以直接调用另一个用例吗
export function importNewWorkflowTemplate(specs){

  const { workflowRepository  } = specs;

  const exists = checkIfWorkflowWithSameNameExists()
  if(exists){
    //return error
  }
  
  return new (payLoad) => {
    //logic
  }
}

  1. 我应该注入依赖用例
export function importNewWorkflowTemplate(specs){

  const { workflowRepository, checkIfWorkflowWithSameNameExists  } = specs;

  return new (payLoad) => {
    //logic
  }
}

  1. 验证是否应该像控制器一样属于外层?

【问题讨论】:

    标签: node.js clean-architecture


    【解决方案1】:

    您所描述的 - checkIfWorkflowWithSameNameExists() - 不是用例。

    这只是一种放在域服务上的方法,例如存储库。这可能是您的工作流存储库中的存储库方法,例如 hasWorkflowWithName(name)。存储库表示聚合的集合,因此最清楚是否已经存在同名的聚合。

    如果有更复杂的域逻辑来检查现有存储库,然后执行一些错误处理或执行特定逻辑来创建逻辑,您还可以考虑将这些步骤封装在 域服务中 方法。在这种情况下,工作流存储库接口将被注入到工作流域服务中,然后再次注入到用例中。

    这样您就可以在两个用例中使用相同的域服务,并且用例负责协调外部命令与域服务接口和相应域实体之间的转换。

    【讨论】:

    • 谢谢。我认为这一点,假设我有一个查询生成器的逻辑。查询构建器需要了解数据库列,同时他们不负责管理数据访问。那么你会将查询构建器作为域服务吗?
    • 域服务不应该有任何持久性依赖。这也意味着您定义数据库结构的所有代码(例如列名)也应该是基础设施层的一部分。通常,存储库用于此类情况。您在域层中定义了一个 repository 接口,但它是了解具体数据库访问的实际实现驻留在基础架构层中。
    猜你喜欢
    • 2017-03-20
    • 2021-01-22
    • 1970-01-01
    • 2019-03-28
    • 2022-05-18
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2021-10-16
    相关资源
    最近更新 更多