弄清楚如何链接面向对象的代码和数据库存储。
Python MongoDB驱动程序PyMongo
将结果作为字典返回。我需要将它们变成对象以便进一步处理。
假设每个集合的数据访问对象(DAO
),从其余代码中隐藏MongoDB查询。
在主代码中创建对象
DAO
方法get_buildings_by_date()
将建筑物列表作为词典返回。
主代码中的total_area_by_date()
方法调用get_buildings_by_date()
以获取构建描述列表作为字典,实例化构建,然后使用构建中的方法进行计算。
在DAO
DAO
方法get_buildings_by_age()
实例化构建并返回构建实例列表。
total_area_by_date()
方法调用get_buildings_by_date()
,然后使用Building中的方法进行计算。
从对象本身调用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()
,然后使用构建实例。
编辑:不要在数据库管理之外公开集合间链接。对象不应包含对数据库中相关文档的引用(_id
)。例如,如果Buildings集合的每个文档都有一个所有者元素,其中包含Persons集合中文档的_id
,则良好的图层分离意味着要么剥离所有者,要么将其查询并作为人物实例。
我想我错过了一个设计模式。知道我应该选择哪种解决方案(或任何其他解决方案)?
我读过一些关于ODM
s(MongoEngine,MongoKit,MongoLite,Ming)的内容。我们是否将使用pymongo
或ODM
尚未确定,但有关ODM
一般或ODM
如何回答/隐藏此问题的提示是受欢迎的。
考虑到存储库模式,避免使用解决方案1是有意义的,因为主代码不应该暴露其他东西而不是它所依赖的类。
我认为3.是MongoEngine所做的。
答案 0 :(得分:0)
存储库在域和数据映射层之间进行调解,其作用类似于内存中的域对象集合。