【问题标题】:Is it a bad practice to use service layer in domain layer? [closed]在域层中使用服务层是一种不好的做法吗? [关闭]
【发布时间】:2021-10-27 05:48:58
【问题描述】:

我正在使用 Spring、JPA 和 AWS S3 服务。

在我的项目中...
服务层有一个S3Service类。
领域层有一个image类,其属性为S3上的图片文件名。

每当从数据库中删除图像表的元组时,都应删除相关的 S3 文件。
所以,我想在image中使用@PreRemove注解,这样图片在被删除之前就可以使用S3Service的删除方法了。

在领域层访问服务层是不好的做法吗?
如果是这样,删除元组时如何删除 S3 文件?

【问题讨论】:

  • 恕我直言,S3Service 不是服务,而是与您的存储库位于同一层的集成类。
  • DB表中的数据如何删除?它是通过服务调用的存储库完成的吗?
  • @JoãoDias 来自 JPA。 Cascade.REMOVE 选项或 orphanRemoval=true

标签: spring spring-mvc jpa amazon-s3


【解决方案1】:

我想说的是,从实体中删除数据(或调用存储库上的相应方法)的服务也应该调用 S3Service 以从 S3 中删除此类文件。

在我看来,您应该尽可能保持服务相互通信,以便将业务逻辑保持在这样的层中。否则,您可能会得到难以阅读、维护和更改的意大利面条式代码。


另一种方法是让 S3 删除由事件驱动。在这种情况下,每当您删除 Post 时,您将发布一个事件,其中包含要删除的图像 ID 或已删除的 Post 的 ID(如果您能够在 S3 上找到要删除的图像) )。这将使删除数据库中的实体与删除 S3 中的图像分离。这将是我的首选方法。

【讨论】:

  • 感谢您回答我的问题。就我而言,我使用的是 JPA,图像元组是通过级联和 orphanRemoval 选项而不是直接由服务或存储库层删除的。
  • 因此,如果我删除例如帖子,那么系统会删除该帖子中上传的图像
  • 在这种情况下,删除Post 的人还必须通过调用S3Service 触发从S3 中删除相关图像。像往常一样,重要的是让这个Post 删除由一个类完成,而不是遍布整个代码。或者您可以遵循我添加到我的答案中的事件驱动方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
  • 2020-06-04
  • 2019-05-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2015-01-12
相关资源
最近更新 更多