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

时间:2015-11-12 13:56:58

标签: python mongodb design-patterns pymongo

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

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

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

我应该从数据库中的描述创建对象?

  1. 在主代码中创建对象

    DAO方法get_buildings_by_date()将建筑物列表作为词典返回。

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

  2. DAO

    中创建对象

    DAO方法get_buildings_by_age()实例化构建并返回构建实例列表。

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

  3. 从对象本身调用DAO

    DAO的调用属于Building类本身,对total_area_by_date()方法隐藏。

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

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

  4. 编辑:不要在数据库管理之外公开集合间链接。对象不应包含对数据库中相关文档的引用(_id)。例如,如果Buildings集合的每个文档都有一个所有者元素,其中包含Persons集合中文档的_id,则良好的图层分离意味着要么剥离所有者,要么将其查询并作为人物实例。

    我想我错过了一个设计模式。知道我应该选择哪种解决方案(或任何其他解决方案)?

    我读过一些关于ODM s(MongoEngine,MongoKit,MongoLite,Ming)的内容。我们是否将使用pymongoODM尚未确定,但有关ODM一般或ODM如何回答/隐藏此问题的提示是受欢迎的。

    更新

    考虑到存储库模式,避免使用解决方案1是有意义的,因为主代码不应该暴露其他东西而不是它所依赖的类。

    我认为3.是MongoEngine所做的。

1 个答案:

答案 0 :(得分:0)

使用Repository Pattern

  

存储库在域和数据映射层之间进行调解,其作用类似于内存中的域对象集合。

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