試圖遵守DRY原則,以下是使多個對象共享通用角色關係表的有效方法。共享相同角色關係表的多個實體
如果我們有以下幾種類型(純粹是爲了這個例子創建):
class User
{
...
}
class Article
{
...
}
這些對象都需要有對他們定義的角色。因此,角色對於這些對象中的任何一個都不是唯一的。
我的想法是讓Repositories在這些對象上執行CRUD操作,還讓Role有可能通過服務訪問它自己的Repository?
存儲庫會將UserDTO和ArticleDTO反饋給Builder類,該類將生成必需的Domain對象。在這種情況下:
class User
{
...
IList<Role> Roles { get; set; }
//Other Domain objs/logic
}
class Article
{
...
IList<Role> Roles { get; set; }
//Other Domain objs/logic
}
角色對象有一個角色表:
ID名稱
而且關係表:
的itemId角色ID ITEMTYPE
作用生成器/服務用於將角色附加到域對象可能看起來像這樣:
static class RoleBuilder
{
IEnumerable<Role> Fetch(int id, typeof(obj))
{
//fetch from RoleRep
}
bool Save(IEnumerable<Role>, int id, typeof(obj))
{
//save through role rep
}
}
這個想法有什麼內在的錯誤嗎?例如:
public static UserBuilder
{
public User FetchUser(int id)
{
//map userDTO to user
var user = map...
//populate roles
if(user != null)
user.Roles = RoleBuilder.Fetch(id, typeof(user));
}
}
另一種方法是讓用戶和物品管理他們自己的角色操作並且可能有多個角色關係表例如user_has_roles,article_has_roles
第一種解決方案允許最終用戶也修改角色(重命名,添加新角色等),而不會破壞領域模型,而在第二種解決方案中,我不確定如何幹淨地做到這一點(更新他們通過用戶,通過文章?)
貌似很多的精力來跟蹤「角色」,幾乎沒有任何與之相關聯的行爲。另外,從技術上講,說用戶和文章具有角色'IHaveRoles'或'HasRoles'(對於命名衝突如何)更合適。如果「角色」真的是一個單獨的概念,那麼可能值得探討它們是否屬於相同的有界環境。 –
謝謝伊夫!我對我最初的建議的結構有了一些想法,並且已經改變了很多。我可能會發布更新以備將來參考。 –