在哪里实例化存储在数据库中的对象?

Where to instantiate objects stored in database?

弄清楚如何link面向对象的代码和数据库存储。

Python MongoDB 驱动程序,PyMongo,returns 结果作为字典。我需要将它们变成对象以供进一步处理。

为每个集合假定数据访问对象 (DAO),从其余代码中隐藏 MongoDB 查询。

我应该在哪里根据对象在数据库中的描述创建对象?

  1. 在主代码中创建对象

    DAO 方法 get_buildings_by_date() return 作为字典的建筑列表。

    主代码中的total_area_by_date()方法调用get_buildings_by_date()获取建筑物描述列表作为字典,实例化Building,然后使用Building中的方法进行计算。

  2. DAO

    中创建对象

    DAO 方法 get_buildings_by_age() 实例化 Building 和 returns Building 实例列表。

    total_area_by_date() 方法调用 get_buildings_by_date(),然后使用 Building 中的方法进行计算。

  3. 从对象本身调用DAO

    DAO 的调用在建筑物 class 本身中,对 total_area_by_date() 方法隐藏。

    构建 class 具有 return 构建实例的静态方法。例如,它有一个 get_buildings_by_date() class 方法,该方法从 DB 管理层调用 get_buildings_by_date() 方法,创建所需数量的 Building 实例并将它们 returns 作为列表。

    total_area_by_date() 调用 Building.get_buildings_by_date(),然后使用 Building 实例。

编辑:不要在数据库管理之外公开集合间 link。对象不应包含对数据库中相关文档的引用 (_id)。例如,如果 Buildings 集合的每个文档都有一个 owner 元素,其中包含 Persons 集合中文档的 _id,良好的层分离将意味着所有者被剥离,或者被查询并且 return也作为 Person 实例编辑。

我想我在这里缺少设计模式。知道我应该选择哪种解决方案(或任何其他解决方案)吗?

我读过一些关于 ODM 的文章(MongoEngine、MongoKit、MongoLite、Ming)。我们将使用 pymongo 还是 ODM 尚未决定,但有关一般情况下 ODM 或特定 ODM 的提示 answers/hides欢迎。

更新

考虑到存储库模式,避免解决方案 1 是有意义的,因为除了它所作用的 classes 之外,不应公开主要代码。

我认为 3. 是在 MongoEngine 中完成的。

使用Repository Pattern

A Repository mediates between the domain and data mapping layers, acting like an in-memory domain object collection.

  • 首先,确保你有一个独立于数据库的模型。您是否应该构建一个成熟的域模型或只使用一个简单的 属性 包模型是另一个问题,但在这里无关紧要。
  • 构建一个存储库,该存储库接受用于创建和更新操作的模型对象,以及来自读取操作的 returns 模型对象。 DAO 现在是存储库的内部概念,对应用程序的其余部分不可见。
  • 现在存储库负责将 DAO 映射到模型对象,反之亦然。如果您可以以通用方式实现映射,请将其从存储库中提取到专用映射器中,并使用存储库中的映射器来遵守 Single Responsibility Principle.