在我的应用程序中,有帖子、评论、投票实体。
我注入了帖子服务、评论服务来验证投票数据。
投票服务
@Transactional
public boolean votePost(Member currentMember, Long postId)
{
Post post = postService.getPostById(postId);
Optional<Vote> optionalVote = voteRepository.findByMemberAndPost(currentMember, post);
if(optionalVote.isPresent())
{
voteRepository.delete(optionalVote.get());
return false;
}
else
{
voteRepository.save(new Vote(currentMember, post));
return true;
}
}
我还需要帖子服务和评论服务中的投票服务来检查登录用户的投票状态。
投票服务
public boolean checkIfMemberVotedPost(Long memberId, Long postId)
{
return voteRepository.existsVoteByMemberIdAndPostId(memberId, postId);
}
public boolean checkIfMemberVotedComment(Long memberId, Long commentId)
{
return voteRepository.existsVoteByMemberIdAndCommentId(memberId, commentId);
}
但这种情况下,会出现bean循环依赖错误。
我想知道更好的设计或方法。
我知道使用 @Lazy 可以解决这个问题,但这是否是一个有效的解决方案而不是重新设计应用程序?
只要不创建循环逻辑,使用循环依赖就没有问题,即服务 A 调用服务 B,服务 B 又调用服务 A,服务 A 又调用服务 B......
这是我们应该避免循环依赖的主要原因,因为只要存在循环依赖,循环逻辑就可能存在。然而,这并不一定意味着它总是不好的。这只是意味着你必须更加小心。
话虽如此,您可以通过多种方法重新设计应用程序来解决此问题。例如,您可以使投票系统实体独立,而不是将
Vote
与 Post
紧密耦合。换句话说,您可以向任何“实体”添加“投票”,并且可以使用 (EntityType, EntityID)
键存储投票。然后,当您获取投票时,您只需通过投票的 ID 和类型来获取投票即可。这将消除对 PostService
中的 VoteService
的依赖,并且还为用户提供了对其他类型的内容“投票”的可能性。此外,您将让 votePost
方法流经 PostService
而不是 VoteService
,因为 VoteService
现在是通用投票机制,并且 PostService
将专门负责对该实体进行投票。但这只是解决问题的一种方法。
祝你好运!