如何使用丰富的模型方法,DDD和ruby正确建模给定的动作

时间:2014-02-26 11:20:50

标签: ruby domain-driven-design

我正在处理我的宠物项目,我有以下情况:

  • 用户可以创建文章并成为其所有者
  • 只有文章所有者才能编辑给定的文章

我想知道如何正确建模。我不希望像UserArticle这样的哑对象只有属性,但希望它们有一些行为。这就是我最初接近它的方式:

article = articles_repository.find(id)
if(article.changeable_by(user))
  article.change(title, content)
  articles_repository.save(article)
else 
  raise NoEditRights
end

我唯一关心的是我需要在修改之前检查用户是否可以修改。一世 另一种方法是将当前用户传递给change方法,让article检查它并在不允许用户更改时引发错误。

我也在考虑这样的事情:

article = articles_repository.find(id)
article.as_user(user) do 
  article.change(title, content)
  articles_repository.save(article)
end

但我不知道它是否更好。

你会如何处理这种情况?如何在内部阻止文章被其他用户更改我知道这很简单,但我想了解如何在我遇到更困难的事情之前对这些案例进行建模。

编辑:添加了更多信息

因此,这是内容发布应用程序,用户可以撰写和发布文章,其他人可以阅读和评论文章。

这是一个非常简单的应用程序(只是一个玩具项目),我可以在这里看到以下有界的背景:

  • 发表文章
  • 编辑文章
  • 其他一些我认为不重要的事情(如文章评论)

我不确定是否应该为每种情境引入不同的模型?

1 个答案:

答案 0 :(得分:1)

这些不是有限的上下文,而是一些用例。

根据您的说法,我猜有2个有界的背景:发布访问管理。访问管理 - 除非你愿意介绍一些非常规的机制 - 是一个普遍关注的问题,可能不需要你的专注和DDD - 只需添加一些好的库来解决这个问题。也许可以用一些应用程序服务包装它。

所以在某些应用程序服务中会有一个方法做类似的事情(伪代码,抱歉,我不知道Ruby):

var user = auth::authenticationService.getUser(...)
if user.hasAccessTo(articleId) then
    var article = pub::articleRepo.get(articleId)
    article.doSomething()
end

请注意,身份验证服务和用户属于一个上下文(auth),文章和文章repo属于另一个(pub)。它们之间只有很小的联系。用户对pub上下文中的文章一无所知(它只是一个存储id的值对象),文章对访问管理一无所知(但可能有一个包含其名称的用户的值对象)。

另一种方法是在pub上下文中引入一些小对象,例如Author,Editor,Commenter,代表文章中的角色。

var role = pub::roleService.getAuthorFor(articleId, userId)
if role != null then
    role.doSomethingWithArticle()
end

其中roleService充当auth和pub之间的反腐败层(因此它调用authenticationService,获取充满特定于auth的东西的用户对象,并基于它构建一个仅包含pub特定行为的轻量级角色对象。

第二个例子听起来更重,但在一个上下文中更容易发生变化。

相关问题