试图遵守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'(对于命名冲突如何)更合适。如果“角色”真的是一个单独的概念,那么可能值得探讨它们是否属于相同的有界环境。 –
谢谢伊夫!我对我最初的建议的结构有了一些想法,并且已经改变了很多。我可能会发布更新以备将来参考。 –