0

假设我有以下课程:

@Entity
public class Book {
...
}

@Repository
public class BookRepositoryImpl implements BookRepository {    
...
}

@Service
public class BookServiceImpl implements BookService {
...
}


@Entity
public class Author{
...
}

@Repository
public class AuthorRepositoryImpl implements AuthorRepository {
...
}

@Service
public class AuthorServiceImpl implements AuthorService {
...
}

现在我想和作者一起保存一本书。对于我的 BookService,我以某种方式将 BookDto 传递给除作者之外的所有信息,并作为第二个参数传递作者 ID。现在要保存我的书,我必须组装 Book 实体。哪一层是创建它的正确层?我看到的可能性很少,但我不确定哪种方法是正确的:

  • 在 BookingService.createBook 我可以调用 AuthorService.findAuthorById 并使用此组装书,然后将其传递给 BookRepository
  • 在 BookingService.createBook 我可以调用 AuthorRepository.findAuthorById 并使用此组装书,然后将其传递给 BookRepository
  • 我可以将所有信息传递给存储库并让它处理实体,通过这个创建我的意思是:在 BookingService.createBook 调用 BookRepository.saveBookWithAuthor(Book book, Long authorId) 并且在这个方法中我可以调用 AuthorRepository.findAuthorById 或者我可以调用 AuthorService。 findAuthorById,组装 Book 实体并持久化

哪种方法是正确的,为什么?在我看来,逻辑解决方案是第一个,但是我不喜欢将实体组合与可能在我的服务内部的一些业务逻辑混合在一起的想法。是否有将业务逻辑与技术解决方案分开的模式?

4

1 回答 1

1

您可以使用BookingService.createBook来组装数据。因为一本书必须至少有一个作者。服务层用于业务逻辑。您需要将所有数据指定到该层。您可以从AuthorService调用AuthorRepository但您必须从BookService调用AuthorService。因为BookService不能直接使用AuthorRepository。所以在AuthorService上定义一个方法来通过 ID 获取作者并从BookService调用AuthorService服务方式。您可以通过它的服务层访问每个存储库,因为要获取数据,每个服务在这些数据背后都有一些逻辑要返回。每个服务层都负责其存储库层。

所以定义AuthorService.findAuthorById(long id)然后从 BookService 调用这个方法并在 bookservice 组装数据。

于 2018-11-16T09:26:02.457 回答