Пытаясь придерживаться принципов СУХОГО, будет ли следующий способ иметь несколько объектов с общей таблицей отношений ролей.
Если у нас есть следующие типы (созданные исключительно для этого примера):
class User
{
...
}
class Article
{
...
}
Для обоих этих объектов должны быть определены роли против них. Таким образом, Роль не уникальна ни для одного из этих объектов.
Моя идея заключалась в том, чтобы репозитории выполняли операции CRUD над этими объектами, а также позволяли Role иметь свой собственный репозиторий, доступ к которому возможно через службу?
Репозитории будут передавать 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
}
Объект Role будет иметь таблицу Role:
ИД
И таблица отношений:
itemId roleId 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
Первое решение позволило бы конечным пользователям также изменять роли (переименовывать, добавлять новые роли и т. Д.), Не повреждая модель домена, тогда как во втором решении я не уверен, как это сделать чисто (обновите их через пользователь, через статью?)