Каков наилучший дизайн для этого сценария?
У меня разные типы объектов: User
, Channel
, MessageBox
, UserGroup
и т.д. User
и Channel
могут иметь разрешение на другие объекты. Например, User
имеет следующее перечисление, определенное как его разрешения для MessageBox
:
CanRead,
CanWrite,
CanDelete,
...
Другие перечисления определены для User
как владелец других типов объектов.
Кроме того, Channel
имеет разные значения enum для этих объектов. Например, рассмотрите 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
перечисление. Создайте класс factory и вызовите Менеджеры, например:
IPermissionManager UserManager =
PermissionFactory.Create(PermissionsManagerTypes.User);
if (UserManager.HasAccess(CurrentUser,
CurrentMessageBox,
UserPermissions.CanReadMessages))
Это своего рода неудачная попытка связать классы вместе. Но я подумал, что было бы неплохо упомянуть об этом здесь, чтобы вы знали, чего я пытаюсь достичь.
P.S. Я не могу определить классы как статические, так как они должны иметь приватную переменную типа ObjectContext
(Entity Framework).
Есть ли лучшее решение для достижения этого?
Спасибо и извиняюсь за очень длительный вопрос.