以这本书为例,假设我有一个带有以下API的图书资源(还有更新和删除等,但为了简单起见,这里只显示两个)
GET /book/{id}
POST /book
每个API都会调用其他API来获得结果,而不是典型的CRUD数据库操作.根据需求/现有框架约束,有两个单独的控制器类GetBookController
和CreateBookController
.控制器负责处理请求和响应.因此,实际的业务逻辑和检索/创建图书都在服务层.
接下来的问题是,是应该为每一个book操作(GetBookService
和CreateBookService
)提供一个单独的接口,还是只有一个接口(BookService
)?
基于接口隔离原则,该原则规定"不应强迫客户依赖他们不使用的接口".在这里,GetBookController
类是客户机,它只需要查询book而不创建book,因此只需要GetBookService
.如果使用BookService
,则不使用方法createBook
,这似乎违反了ISP原则.然而,如果使用单独的接口,将导致创建许多接口和实现类.我是否误解了ISP原则?
@Controller
public class GetBookController {
@Autowired
private GetBookService getBookService;
}
@Controller
public class CreateBookController {
@Autowired
private CreateBookService createBookService;
}
public interface GetBookService {
Book getBook(long id);
}
public interface CreateBookService {
Boolean createBook(Book request);
}
public interface BookService {
Book getBook(long id);
Boolean createBook(Book request);
}