仓库模式 Repository Pattern - structural pattern, 2025-03-16

(2025.03.16 Sun)

Domain-Driven Design, DDD

在软件设计的DDD方法中,domain指的是所开发软件的核心业务逻辑、该软件/服务所要解决的问题。DDD鼓励开发者与业务专家/业务方紧密合作、根据该业务/领域的真实世界(real-world)概念完成开发,而非直接开始写代码。

DDD步骤:

  • 理解领域的业务逻辑:理解软件所要解决的的业务问题
  • 与领域专家合作:以了解所要解决业务问题的规则、条款、概念,称为uniquitous language
  • 对领域建模:用类和对象将业务内容翻译为代码,目标是用软件模拟业务运行的真实情况

Repository Pattern 仓库模式

仓库模式是DDD的一部分。该模式将数据接入(data access)部分独立出来,实现对数据和数据库的中心化管理,比如对数据库连接的封装(encapsulation)、CRUD操作,在业务逻辑和数据存储/数据层(data layer)之间建立中间人的角色。通过将数据层和业务逻辑的隔离,增强了代码的可维护性(maitainability),可测试性(testability),灵活性,也方便了管理不同数据源。

仓库模式为数据的接入和管理提供了结构化、标准化的方式,管理数据时可抽象数据库的实现细节。

Case

from pydantic import BaseModel

class SomeModel(BaseModel):
    id: int
    name: str
    other_field: list[str]

class DataBaseRepository():
    def __init__(self):
        self._db_access = self.db_access()

    def db_access(self):
        raise KeyError("To be implemented")
    
    def add_records(self):
        raise KeyError("To be implemented")

    def remove_records(self):
        raise KeyError("To be implemented")
    ...

class MongoDBRepository(DataBaseRepository):
    def db_access(self):
        # connect to mongoDB
        pass

    def add_records(self, records: list[BaseModel]) -> list[BaseModel]:
        # add records
        pass

    def remove_records(self, ids: list[int]) -> list[int]:
        # remove records from Cosmos
        pass

class BusinessLogic:
    def __init__(self):
        self._db_repo = MongoDBRepository()

    def add_records(self, records: list[SomeModel]) -> list[SomeModel]:
        res = self._db_repo.add_records(records)
        return res
    
    def remove_records(self, ids: list[int]) -> list[int]:
        res = self._db_repo.remove_records(ids)
        return res

Reference

1 Repository Design Pattern, Per-Erik Bergman, Medium
2 Repository Patter, Nilesh Borole, Medium
3 Simplifying Database Interactions in Python with the Repository Pattern and SQLAlchemy, Ryan Zhang, Medium
4 Repository Design Pattern, geeksforgeeks
5 Microsoft Copilot

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容