在哪里实例化存储在数据库中的对象?
Where to instantiate objects stored in database?
弄清楚如何link面向对象的代码和数据库存储。
Python MongoDB 驱动程序,PyMongo
,returns 结果作为字典。我需要将它们变成对象以供进一步处理。
为每个集合假定数据访问对象 (DAO
),从其余代码中隐藏 MongoDB 查询。
我应该在哪里根据对象在数据库中的描述创建对象?
在主代码中创建对象
DAO
方法 get_buildings_by_date()
return 作为字典的建筑列表。
主代码中的total_area_by_date()
方法调用get_buildings_by_date()
获取建筑物描述列表作为字典,实例化Building,然后使用Building中的方法进行计算。
在 DAO
中创建对象
DAO
方法 get_buildings_by_age()
实例化 Building 和 returns Building 实例列表。
total_area_by_date()
方法调用 get_buildings_by_date()
,然后使用 Building 中的方法进行计算。
从对象本身调用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.
弄清楚如何link面向对象的代码和数据库存储。
Python MongoDB 驱动程序,PyMongo
,returns 结果作为字典。我需要将它们变成对象以供进一步处理。
为每个集合假定数据访问对象 (DAO
),从其余代码中隐藏 MongoDB 查询。
我应该在哪里根据对象在数据库中的描述创建对象?
在主代码中创建对象
DAO
方法get_buildings_by_date()
return 作为字典的建筑列表。主代码中的
total_area_by_date()
方法调用get_buildings_by_date()
获取建筑物描述列表作为字典,实例化Building,然后使用Building中的方法进行计算。在
中创建对象DAO
DAO
方法get_buildings_by_age()
实例化 Building 和 returns Building 实例列表。total_area_by_date()
方法调用get_buildings_by_date()
,然后使用 Building 中的方法进行计算。从对象本身调用
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.