Каков лучший дизайн для этого сценария?
У меня есть разные типы объектов: User
, Channel
, MessageBox
, UserGroup
и т. Д.
User
и Channel
могут иметь разрешение на другие объекты. Например, User
имеет следующее перечисление, определенное как его разрешения для MessageBox
:
CanRead,
CanWrite,
CanDelete,
...
Другие перечисления определены для User
как владелец других типов объектов.
Кроме того, Channel
имеет различные значения перечисления для этих объектов. Например, рассмотрим Channel
как владельца и MessageBox
как объект:
CanDispath
CanRetrieve
...
Все разрешения сохраняются и извлекаются из определенной таблицы в базе данных с использованием побитового сравнения:
OwnerID........OwnerType........ObjectID........ObjectType........AccessLevel
1 User 10 MessageBox 38
5 Channel 12 MessageBox 18
Теперь в коде позади, Каков наилучший способ реализации классов разрешений?
1 - Определите PermissionManager
, UserPermissionManager
, ChannelPermissionManager
классов отдельно друг от друга. Другие классы просто звоните PermissionManager
как:
if (new PermissionManager.HasAccess(CurrentUser,
CurrentMessageBox,
UserPermissions.CanReadMessages))
Затем PermissionManager
решает, к какому классу это относится, на основе OwnerType
(UserPermissionManager
или ChannelPermissionManager
) и вызывает его метод HasAccess
. Таким образом, PermissionManager.HasAccess
всегда вызывается, и я думаю, что это может сделать код более понятным и расширяемым. Это мое предпочтительное решение, но поскольку PermissionManager
, UserPermissionManager
и ChannelPermissionManager
относятся к одному и тому же контексту, я думаю, что должна быть иерархия или, возможно, интерфейс, чтобы эти 3 класса стали более интегрированными. Но я не знаю, как их связать.
2 - Определите IPermissionManager
интерфейс и внедрите UserPermissionManager
и ChannelPermissionManager
из него. Добавьте PermissionManagerTypes
enum. Создайте класс фабрики и назовите менеджеров как:
IPermissionManager UserManager =
PermissionFactory.Create(PermissionsManagerTypes.User);
if (UserManager.HasAccess(CurrentUser,
CurrentMessageBox,
UserPermissions.CanReadMessages))
Это своего рода неудачная попытка связать классы вместе. Но я подумал, что было бы хорошо упомянуть об этом здесь, чтобы вы знали, чего я пытаюсь достичь.
P.S. Я не могу определить классы как статические, так как они должны иметь закрытую переменную типа ObjectContext
(Entity Framework).
Есть ли лучшее решение для достижения этой цели?
Спасибо и извинения за очень длинный вопрос.