Каков наилучший дизайн для этого сценария?
У меня разные типы объектов: 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).
Есть ли лучшее решение для достижения этого?
Спасибо и извиняюсь за очень длительный вопрос.