在域层中使用服务层是一种不好的做法吗?
Is it a bad practice to use service layer in domain layer?
我正在使用 Spring、JPA 和 AWS S3 服务。
在我的项目中...
服务层有个S3Service
class
域层中有一个image
class,它有一个属性是S3上的图像文件的名称。
每当从数据库中删除图像 table 的元组时,都应删除相关的 S3 文件。
所以,我想在image
中使用@PreRemove
注解,这样图片在被删除之前可以使用S3Service
的delete方法。
在域层访问服务层是一种不好的做法吗?
如果是这样,我如何在删除元组时删除 S3 文件?
我想说的是,从实体中删除数据(或调用存储库上的相应方法)的服务也应该调用 S3Service
从 S3 中删除此类文件。
在我看来,您应该尽可能让服务保持相互通信,以便将您的业务逻辑保留在这样的层中。否则,您最终可能会得到难以阅读、维护和更改的意大利面条式代码。
另一种方法可以让 S3 删除是事件驱动的。在这种情况下,每当您删除 Post
时,您都会发布一个事件,其中包含要删除的图像的 ID 或已删除的 Post
的 ID(如果您能够通过它找到图像在 S3 上删除)。这会将数据库中实体的删除与 S3 中图像的删除分离开来。这是我的首选方法。
我正在使用 Spring、JPA 和 AWS S3 服务。
在我的项目中...
服务层有个S3Service
class
域层中有一个image
class,它有一个属性是S3上的图像文件的名称。
每当从数据库中删除图像 table 的元组时,都应删除相关的 S3 文件。
所以,我想在image
中使用@PreRemove
注解,这样图片在被删除之前可以使用S3Service
的delete方法。
在域层访问服务层是一种不好的做法吗?
如果是这样,我如何在删除元组时删除 S3 文件?
我想说的是,从实体中删除数据(或调用存储库上的相应方法)的服务也应该调用 S3Service
从 S3 中删除此类文件。
在我看来,您应该尽可能让服务保持相互通信,以便将您的业务逻辑保留在这样的层中。否则,您最终可能会得到难以阅读、维护和更改的意大利面条式代码。
另一种方法可以让 S3 删除是事件驱动的。在这种情况下,每当您删除 Post
时,您都会发布一个事件,其中包含要删除的图像的 ID 或已删除的 Post
的 ID(如果您能够通过它找到图像在 S3 上删除)。这会将数据库中实体的删除与 S3 中图像的删除分离开来。这是我的首选方法。