我正在开发一个应用程序,使用Repository-Service-Controller模式设计REST API。
我在控制器逻辑与服务逻辑之间犹豫不决。服务逻辑处理业务逻辑,例如计算书籍价格,而控制器逻辑应处理展示细节。
- 如果应用程序的一部分业务逻辑是检查出版商是否订阅了
PremiumService
以确定书籍是否可编辑?这将放在业务逻辑还是控制器逻辑中? - 如果在控制器中,我想要在没有订阅
PremiumService
的情况下隐藏正在呈现的书籍?那么PremiumService
是否成为PublisherController
的依赖项,以检查书籍的出版商是否已经在PremiumService
中订阅?
但我可以看到过度依赖BookService可能会导致混乱的代码。
这里是一个接口,带有伪代码以帮助回答我的问题。
class Publisher
{
public function getId(): int;
public function getName(): string;
public function getBooks(): Book[];
}
和
class Book
{
public function getId(): int;
public function getName(): string;
public function getPublisher(): Publisher;
public function getAuthors(): Author[];
}
和
class Author
{
public function getId(): int;
public function getName(): string;
public function getBooks(): Book[];
}
简单的 CRUD 存储库。class BookRepository
{
public function find($id);
public function findAll($criteria);
public function create($book);
public function edit($book);
public function remove($book);
}
服务
class BookService
{
public function __construct(
BookRepository $book_repository,
AuthorService $author_service,
PremiumService $subscription_service
);
public function get($id);
public function getAll($criteria);
// Book is editable if the publisher of the book is subscribed to the PremiumService
public function edit(Book $book);
// Book is removable if the publisher of the book is subscribed to the PremiumService
public function remove(Book $book);
// Can only add an author if the publisher of the book is subscribed to the PremiumService.
public function addAuthor(Author $author, Book $book);
}
控制器
class PublisherController
{
public function __construct(BookService $book_service);
// Can only view a book if the publisher of the book is subscribed to the PremiumService
public function getBook(Request $request);
// Can only view books if the publisher of the book is subscribed to the PremiumService
public function getBooks(Request $request);
}
如果一个服务依赖于过多的其他服务,通常或建议的做法是什么?该服务是否应该像存储库一样简单?