Я работаю над системой безопасности на уровне записей для приложения LINQ-to-SQL. В настоящее время у меня есть оболочка вокруг метода GetTable объекта DataContext, который соединяет T с таблицей перекрестных ссылок пользователя. T - это любой класс, который реализует мой интерфейс ISecurable:
public interface ISecurable
{
bool CanRead { get; set; }
bool CanUpdate { get; set; }
bool CanDelete { get; set; }
}
Мой базовый класс репозитория выполняет объединение и обновляет свойства CanRead, CanUpdate и CanDelete для каждой истории для указанного пользователя:
var storiesVisibleToUser = repository.Get<Story>( user );
Я бы хотел заменить упаковщик методом расширения, чтобы я мог сделать что-то вроде этого:
var storiesVisibleToUser = repository.Get<Story>().ApplySecurity( user );
Это тонкое изменение, но оно значительно уменьшит связь между кодом безопасности и общим кодом доступа к данным, так что это даст мне больше гибкости для добавления таких вещей, как безопасность на уровне группы.
Проблема в том, что метод расширения ApplySecurity не имеет доступа к исходному DataContext, поэтому он не может использовать GetTable <> для получения записей перекрестных ссылок.
Два вопроса:
Есть ли способ получить DataContext IQueryable, за исключением его подкласса / переноса и передачи контекста в конструктор ?
Является ли метод расширения «правильным» способом сделать это, или я должен придерживаться метода в моем хранилище, который будет иметь доступ к исходному контексту?