CosmicPython项目解析:Repository模式在领域模型与数据存储间的桥梁作用

CosmicPython项目解析:Repository模式在领域模型与数据存储间的桥梁作用

book A Book about Pythonic Application Architecture Patterns for Managing Complexity. Cosmos is the Opposite of Chaos you see. O'R. wouldn't actually let us call it "Cosmic Python" tho. book 项目地址: https://gitcode.com/gh_mirrors/book/book

什么是Repository模式?

Repository模式是一种简化数据存储的抽象层,它通过在领域模型和数据存储之间建立一个中间层,实现了两者的解耦。这种模式的核心思想是让我们的代码"假装"所有数据都在内存中,从而隐藏底层数据存储的复杂性。

为什么需要Repository模式?

在软件开发中,我们经常面临一个基本矛盾:领域模型需要保持纯净和独立,但最终又必须与外部系统(如数据库)交互。Repository模式正是解决这一矛盾的优雅方案。

传统ORM方式的局限性

大多数ORM(对象关系映射)框架采用"声明式"语法,导致领域模型直接继承自ORM基类。这种方式存在明显问题:

  1. 领域模型被数据库细节污染
  2. 模型属性与数据库列直接耦合
  3. 测试变得复杂,需要数据库支持
  4. 更换存储技术困难

依赖倒置原则的应用

Repository模式遵循依赖倒置原则(DIP),实现了:

  1. 领域模型完全独立,不依赖任何基础设施
  2. 数据访问层依赖领域模型,而非相反
  3. 存储细节被抽象化,易于替换实现

如何实现Repository模式?

1. 分离领域模型与ORM映射

使用SQLAlchemy的"经典映射"方式,我们可以保持领域模型的纯净:

# 领域模型保持纯净
class OrderLine:
    def __init__(self, orderid, sku, qty):
        self.orderid = orderid
        self.sku = sku
        self.qty = qty

# ORM映射单独定义
from sqlalchemy.orm import mapper
metadata = MetaData()

order_lines = Table(
    "order_lines", metadata,
    Column("id", Integer, primary_key=True),
    Column("sku", String(255)),
    Column("qty", Integer)),
    Column("orderid", String(255)),
)

def start_mappers():
    mapper(OrderLine, order_lines)  # ORM知道领域模型,但模型不知道ORM

2. 创建Repository抽象

Repository作为内存集合的抽象:

class AbstractRepository(abc.ABC):
    @abc.abstractmethod
    def add(self, batch: model.Batch):
        raise NotImplementedError
    
    @abc.abstractmethod
    def get(self, reference) -> model.Batch:
        raise NotImplementedError

class SqlAlchemyRepository(AbstractRepository):
    def __init__(self, session):
        self.session = session
    
    def add(self, batch):
        self.session.add(batch)
    
    def get(self, reference):
        return self.session.query(model.Batch).filter_by(reference=reference).one()

Repository模式的优势

  1. 测试友好:可以轻松创建内存实现的FakeRepository用于测试
  2. 持久化无关:领域逻辑不依赖具体存储实现
  3. 接口统一:提供一致的数据访问方式
  4. 架构清晰:明确分离业务逻辑与数据访问

实际应用示例

使用Repository后的API端点变得简洁明了:

@flask.route('/allocate', methods=['POST'])
def allocate_endpoint():
    # 从请求中提取订单行
    line = OrderLine(
        request.json['orderid'],
        request.json['sku'],
        request.json['qty'],
    )
    
    # 通过Repository获取批次
    batches = repository.list()
    
    # 调用领域服务
    allocate(line, batches)
    
    # 提交变更
    session.commit()
    
    return 201

总结

Repository模式是连接领域模型与数据存储的理想桥梁。通过这种模式,我们可以:

  1. 保持领域模型的纯净性
  2. 实现基础设施与业务逻辑的解耦
  3. 提高代码的可测试性
  4. 为未来存储技术变更预留空间

在CosmicPython项目中,Repository模式是构建可维护、可测试应用程序的关键组成部分,值得每一位Python开发者深入理解和应用。

book A Book about Pythonic Application Architecture Patterns for Managing Complexity. Cosmos is the Opposite of Chaos you see. O'R. wouldn't actually let us call it "Cosmic Python" tho. book 项目地址: https://gitcode.com/gh_mirrors/book/book

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宗津易Philip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值