Я внедряю инфраструктуру для контроля доступа моделей в веб-приложении.В библиотеке есть класс контекста, который контроллеры (и, возможно, представления) используют для определения, имеет ли текущий пользователь доступ к определенному объекту.Для сохранения соответствующей информации вблизи целевого объекта я решил передать запрос проверки доступа самим моделям из объекта контекста.
Реализация этого механизма для модификации объекта модели является почти тривиальной.Объявите интерфейс, скажем, ICheckModifyAccess
;и реализовать его в вашей модели.То же самое касается проверки удаления.В обоих этих случаях можно спросить экземпляр модели, можно ли их изменить или удалить.
К сожалению, это не относится к операциям чтения и создания.Эти операции требуют, чтобы я задал вопрос модели класс .Поэтому использование интерфейса для этого не вариант.
В итоге я создал атрибут CheckCreateAccessAttribute
, а затем использовал этот атрибут для пометки статической функции в качестве функции интерфейса.Затем в моем объекте контекста я могу использовать отражение, чтобы проверить, существует ли такая помеченная функция, соответствует ли она ожидаемой сигнатуре, и в конце концов вызвать ее.В случае, если это имеет значение, метод для создания проверки доступа - public bool CanCreate<TObj>();
.Типичная модель, которая поддерживает управление доступом, добавила бы в класс что-то вроде следующего:
[CheckCreateAccess]
public static bool CanCreate()
{
return true;
}
Я пока не очень хорошо говорю на C #, и у меня появляется ноющее чувство, что я делаю что-то не так.Можете ли вы предложить более элегантную альтернативу?Особенно, вы можете избавиться от изучения TObj
отражением?