2014-02-26 53 views
0

定的動作我的工作我的寵物項目,我有以下情形:如何正確模擬與豐富的模型方法,DDD和紅寶石

  • 用戶可以創建文章,只有
  • 成爲其所有者文章的所有者可以編輯給定的文章

我不知道如何正確建模。我不想擁有隻有屬性的UserArticle等笨笨物品,但希望它們具有某些行爲。這是我想首先與它:

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

我只有在這裏擔心的是,我需要檢查之前,我做修改,用戶可以修改。 I 另一種方法是將當前用戶傳遞給change方法,並讓article對其進行檢查並在用戶不允許更改時提出錯誤。

我也想是這樣的:

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

,但我不知道這是否是任何好轉。

你會如何處理這種情況?如何在內部防止其他用戶更改文章我知道這非常簡單,但我想要掌握如何在跳入更困難的事情之前對這些案例進行建模。

編輯:一些更多的信息添加

所以這是內容發佈應用程序,用戶可以撰寫和發表文章,其他人可以閱讀和提出意見。

這是非常簡單的應用程序(只是一個玩具項目),我可以看到下面的限界上下文這裏:

  • 發佈文章
  • 編輯文章
  • 一些別人認爲是不重要我猜(喜歡評論文章)

我不知道我是否應該爲每個環境引入不同的模型?

+0

你提供的可能是相當優良或極其錯誤的兩種樣品它取決於一個問題:。究竟你的域名和它包含的是什麼界限?告訴我們更多關於它的信息,然後我可以在設計上添加我的觀點 –

+0

添加了一些更多信息,但不知道是否足夠 – grafthez

回答

1

這些不是有界的上下文,而是一些用例。

從你說的話我估計會有2限界上下文:發佈訪問管理。訪問管理 - 除非你願意引入一些不尋常的機制 - 是一個普遍的問題,可能不需要你的重點和DDD - 只是添加一些好的庫,已經解決了這個問題。也可能用一些應用程序服務包裝它。

因此,在一些應用服務將有做這樣的事情的方法(僞代碼,對不起,我不知道紅寶石):

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

注意,身份驗證服務和用戶屬於一個上下文(AUTH)和文章和文章回購到另一個(酒吧)。他們之間只有很小的聯繫。用戶不知道任何關於pub上下文中的文章(它只是一個存儲id的值對象),文章不知道任何有關訪問管理的信息(但可能有一個包含他名字的用戶值對象)。

另一種方式是在酒吧環境中引入一些微小的對象,例如作者,編輯,評論者代表對文章的角色。

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

其中roleService作爲權威性和酒吧(所以它調用的AuthenticationService,獲取用戶對象充滿了具體的auth-的東西,並在此基礎上,建設一個只包含一個輕量級的角色對象之間的反腐敗層的酒吧,具體 。行爲

第二個例子聽起來更重,但它更容易在上下文中的一個變化