【发布时间】:2017-02-04 07:11:52
【问题描述】:
我对领域驱动设计方法感到困惑。从网上的消息来源,我了解到这是将Domain Objects 和Database Objects 分开的方式,但我不明白两者之间的区别。
我们以 django 教程中 Polls 示例的code 为例,有两个模型Polls 和Choice。
这些是domain level objects 还是database level objects?
是否需要带有 ORM 的 DDD?
如果是,您能否提供一个需要使用带有 ORM 的 DDD 方法的好情况
例如,这是模型
class Polls(models.Model):
question = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
我见过有人写的DDD方法代码
class PollService(object):
def __init__(self, poll_repository):
self.poll_respository = poll_respository
def update(self, poll_id):
poll = self.poll_respository.fetch_by_id(poll_id)
poll.question += '?'
self.poll_respository.update(poll)
#assume that the following code works?
class PollRepository():
def __init__(self, db):
self.db = db
def update(self, poll):
try:
self.db.session().add(poll)
self.db.session.commit()
except Exception:
self.db.session.rollback()
这是正确的方法吗?我在这里看到很多冗余代码,但人们说Polls 是域级别的对象,它不应该直接与数据库对话?
DDD 是否总是带有 DDD 存储库?如果我们有 ORM,为什么我们需要一个 DDD 存储库
另一种方法
views.py
def update_poll(poll_id):
poll = models.Polls.objects.get(poll_id)
poll.question += '?'
poll.save()
这种方法有什么问题?
【问题讨论】:
-
“DDD 是否总是带有 DDD 存储库?” - 不。您可以将 CQRS 与事件溯源一起使用
-
查看github.com/dry-python 项目。它提供了一组工具来轻松地为您的域建模!
标签: python django domain-driven-design ddd-repositories