Eks*_*psy 0 architecture rest repository-pattern
我提出这个问题是为了了解您对此事的看法,并看看我是否愚蠢或迂腐。
当存储库层已经可以以更快的方式通过查询完成大部分事情(例如 FindUserByID)时,当服务必须以低效得多的方式手动完成所有这些事情时,我是否“需要”服务层(为了良好的实践)和超级手动方式?
所以,我一直在研究清洁架构,这很好,但不适用于 REST 架构。因为,Clean Architecture 实际上是由控制器层构成的,而 RPC 是处理控制器的层,而不是 REST。REST 处理资源。所以,我删除了“控制器”层,并且我也在考虑是否真的需要一个“服务”层。
所以 REST 需要“服务”和/或“存储库”。奇怪的是,我认为这两者重叠。我知道服务应该处理“业务规则”。但事情是这样的:
由于允许存储库与数据库直接通信,因此它们可以使用数据库查询(sql 或 nosql)。其写入效率更高、读取效率更高、性能也更高效。
比方说,您需要通过 ID 查找用户,然后通过姓名从他的好友列表中选择特定的朋友。
概括?喜欢 20-30 行代码和较慢的性能?
filter := bson.M{
"_id": id,
"friendlist.name": friendsName,
}
projection := bson.M{
"friendlist": 1
}
friend, err := mongoDb.find(filter, projection)
Run Code Online (Sandbox Code Playgroud)
概括?就像3-4行代码,和99%的数据库性能。
那么,“服务层”部分真的有必要吗?当存储库已经可以更有效地自行完成所有工作时,将其拆分为服务层和存储库层是否有任何真正的架构优势?
对于像“通过id检索用户”这样的小样本,也许不需要服务层。
然而,在更大的应用程序中,事情要复杂得多。一些例子:
将事物分层分开将使测试、调试和更改变得更加容易。如果您遇到数据库查询性能不佳的情况,您可以通过构建更好的查询在存储库层中解决该问题,而无需担心其他部分。如果逻辑中存在错误,您可以在不依赖数据库的情况下修复它,只需构建一个单元测试用例并更新服务层即可完成。
对于一个具有简单用例的单人表演来说,分层是很烦人的。对于一个需要与许多不同的客户和多人一起工作的应用程序来说,这是必要的。
我不同意你对“服务方式”与“存储库方式”的描述。当然,您应该在存储库中提供优化的方法供服务使用,本质上是: Repository:GetSingleUserById 应该存在并在任何情况下进行优化。