создать лучший способ фильтрации данных на основе роли пользователя - PullRequest
2 голосов
/ 02 апреля 2012

У нас есть Сервис, который предоставляет все данные, которые использует клиент, все объекты имеют интерфейс IAuthorized.

данные, которые поступают на клиент, должны быть отфильтрованы на основе учетных данных пользователя.

поток подобен тому, что клиент вызывает службу -> служба вызывает класс SomeManager, который получает данные из базы данных ...

вот идет AuthorizationManager для фильтрации данных ...

public class SomeManager
    {
        public object[] Foo()
        {
            var data = Repository.GetData();
            return autorizationManager.Filter(data);
        }

        public object[] Foo_Else()
        {
            var data = Repository.GetOtherData();
            return autorizationManager.Filter(data);
        }

    }

как видите, каждый метод должен быть отфильтрован,

Итак, я спрашиваю вас: можем ли мы создать базовый класс, который фильтрует каждый метод с некоторым атрибутом выходных данных? это умно? мы должны оставить это так? просто какой метод мы оболочкой называем авторизацией?

Вы можете придумать лучший способ?

нечто подобное:

public class EngineManager :BaseFilterAutho
{
    [AuthorizationCollection]
    public object[] Foo()
    {
        var data = Dao.GetData();
        return data;  //get filtered
    }
       [SingleCollection]
    public object Foo_Else()
    {
        var data = Dao.GetOtherData().First();
        return data //get filtered
    }

}

1 Ответ

1 голос
/ 03 апреля 2012

Я работал над проектом, в котором данные были отфильтрованы по авторизации пользователя. Используемый метод был похож на ваш метод AuthorizationManager. Для этого потребовалось много фильтрующего кода, но он работает нормально и прост для понимания.

Существуют и другие методы, ваша идея, безусловно, может быть реализована. То, что вы имеете в виду, использует Аспектно-ориентированное программирование, АОП. Это распространенный способ в мире Java, а также возможен в .Net. PostSharp - одна сторонняя библиотека, которая делает это возможным. Я никогда не использовал PostSharp в рабочем проекте, но сейчас я играю с ним, чтобы самостоятельно изучить AOP.

Ниже приведен пример аспекта, реализованного с помощью PostSharp, который изменяет возвращаемое значение метода для фильтрации возвращаемых данных. Это фиктивный аспект, в котором я играю с демо PostSharp , фильтруя возвращаемые данные, чтобы вернуть только те контакты, которые содержат букву «S».

Как видите, этот аспект требует, чтобы возвращаемое значение было IQueryable. Я подозреваю, что вам всегда нужно иметь базовые знания о типе возвращаемых значений, например, если вы работаете с IQueryable, ICollection, массивами или чем-то еще.

    [Serializable]
    public class CollectionFilterAspect : OnMethodBoundaryAspect
    {
        public override void OnExit(MethodExecutionArgs args)
        {
            base.OnExit(args);
            IQueryable<Contact> retVal = (IQueryable<Contact>)args.ReturnValue;
            args.ReturnValue = from r in retVal where r.LastName.Contains("S") select r;
        }
    }  

Чтобы использовать этот аспект, вы можете использовать предложенный синтаксис, поместив атрибут в метод, чтобы указать, что он должен быть отфильтрован.

[CollectionFilterAspect]
public IQueryable<Contact> GetByName(string value)

Хотя эта короткая демонстрация иллюстрирует, что это, безусловно, возможно, это может быть или не быть хорошей идеей. У меня нет опыта использования этого программного обеспечения в реальном мире, поэтому я не могу вам помочь.

...