关于项目中 Repository 层的思考

简介: 关于项目中 Repository 层的思考

文章目录:

  • 前言
  • Repository 的定位
  • Repository 的实现
  • Repository 的接口
  • 小结
  • 推荐阅读


前言

关于项目中是否需要 Repository 层?这个问题,好像没有肯定的答案,下面是我的思考分享给大家,不喜勿喷。

Repository 的定位

我理解 Repository 是个大仓库,里面可以有 MySQLRedisMongoDB ... 等数据。

维护这一层的开发者,可以称为 仓库管理员 ,当使用者需要查询数据的时候,需要告诉仓库管理员,由仓库管理员拿给他,至于仓库管理员从哪拿的数据,使用者无需关系。

同理,当需要创建或更新数据的时候,也需要告诉仓库管理员,由仓库管理员进行操作数据。

总结:Repository 主要是封装数据的查询、创建、更新、删除等逻辑,供使用者调用。

Repository 的实现

  • 可配置条件查询
  • 可配置数据转换
  • 可配置数据验证

解释下 “可配置数据转换” :当我们需要返回隐私性字段时,例:如手机号,如果使用者无数据权限时,手机号字段中间 4 位需要进行加 * 处理,还有处理返回的时间格式等。

如果你使用的是 Laravel 框架,可以参考下 andersao/l5-repository[1]

Repository 的接口

Repository 层的接口可以理解为契约(可了解下 Laravel Contracts 目录),它是受 Domain 驱动的,Repository 中定义的功能要体现 Domain 的意图和约束。Domain 需要什么我才提供什么,不需要的我不会提供。

例如,接口名可以定义为 searchUsersByIdsearchUsersByName,不可以定义为 searchUsersByInfo,查询的字段也不建议设置为 * ,仅查询需要的字段进行返回。

什么是 Domain?可以理解为领域层。

小结

使用 Repository 层有利有弊,弊端就是有些繁琐,没有 ORM 一把梭的顺畅。当然优点也有很多,主要是后期的可维护性大大提高。

列举一些优点:

  • 更换、升级 ORM 引擎时,不影响业务逻辑;
  • 便于单元测试,可用 Mock 对象代替实际的数据库存取;

以上,希望对你能够有所帮助。

推荐阅读

参考资料

[1]andersao/l5-repository: https://github.com/andersao/l5-repository

目录
相关文章
|
设计模式 前端开发 Java
DTO和VO的区别及使用场景详解
DTO和VO的区别及使用场景详解
8025 1
|
消息中间件 缓存 前端开发
COLA架构 入门
COLA架构 入门
4256 0
|
存储 自然语言处理 前端开发
领域驱动设计(DDD)-基础思想
一、序言     领域驱动设计是一种解决业务复杂性的设计思想,不是一种标准规则的解决方法。在领域驱动设计理念上,各路大侠的观点也是各有不同,能力有限、欢迎留言讨论。 二、领域驱动设计 DDD是什么 wiki释义:     领域驱动设计(英语:Domain-driven design,缩写 DDD)是一种通过将实现连接到持续进化的模型[1]来满足复杂
8210 0
|
消息中间件 存储 Apache
消息中间件使用规范(RocketMQ)
消息中间件使用规范(RocketMQ)
6134 96
|
2月前
|
弹性计算 人工智能 自然语言处理
QoderCLI 智能编程实战指南:5 分钟部署,一句话生成服务
QoderCLI 不只是工具——它是你 24 小时在线的智能编程伙伴,秒级理解项目上下文,一行指令生成完整功能模块,测试、解释、补全一气呵成。开发效率飙升 300%,代码质量肉眼可见提升!
QoderCLI 智能编程实战指南:5 分钟部署,一句话生成服务
|
7月前
|
JSON Java 数据库
Sringboot JPA实体类关系映射
Springboot-Data-JPA是在工作中经常使用到的ORM框架,我觉的比较好用的点是其集成了大量的对数据库的简单操作,基本满足对数据增删改的需要,JPA关系的映射使用注解的方式,很大程度上提高了代码的可读性。 这里的address是一个Address(地址实体类),"JoinColumn"属性会在当前的student表中添加一个addressId字段,这个字段会和"referencedColumnName"设置的"id"属性进行关联(即addressId关联id属性),实现学生实体和地
199 1
|
7月前
|
存储 人工智能 缓存
SpringBoot离线应用的5种实现方式
在网络依赖日益加深的今天,离线应用的重要性不断上升。本文介绍了基于SpringBoot实现离线应用的五种方式,重点讲解了嵌入式数据库的实现原理与步骤,包括本地数据存储、操作缓存、资源本地化和状态管理等核心功能,分析了其优缺点及适用场景,帮助开发者在无网络环境下构建稳定可靠的应用。
360 0
|
11月前
|
缓存 安全 API
为什么 HTTP GET 方法不使用请求体?
本指南深入探讨了为什么HTTP GET方法通常不使用请求体,解释了GET方法的主要用途及其设计原则。GET请求旨在通过URL安全、幂等地检索数据,避免因请求体带来的复杂性和潜在问题。尽管HTTP/1.1规范允许GET请求包含请求体,但这并不常见且可能引发副作用。掌握这些原则有助于开发者在API开发中更高效地使用GET请求。
|
11月前
|
JavaScript 前端开发 应用服务中间件
菜鸟之路Day25一一前端工程化(二)
本文是《菜鸟之路Day25——前端工程化(二)》的详细记录,作者blue于2025年3月19日撰写。文章基于Vue框架,从零开始搭建前端页面并部署到Nginx服务器。主要内容包括:Element组件库快速入门、综合案例实现(布局设计、组件开发、Axios异步加载数据)、Vue路由配置及项目打包部署。通过实例演示了如何使用Element完成页面构建,配置路由实现页面切换,以及利用Nginx部署前端应用。适合初学者学习前端工程化的完整流程。
207 3
|
机器学习/深度学习 算法 搜索推荐
图神经网络综述:模型与应用
图神经网络综述:模型与应用

热门文章

最新文章