C# 创建一种基于用户角色筛选数据的更好方法

C# 创建一种基于用户角色筛选数据的更好方法,c#,authorization,roles,C#,Authorization,Roles,我们有一个服务,它公开客户端使用的所有数据,所有对象都有接口iaauthorized 输出到客户端的数据需要根据用户凭据进行筛选 该流程类似于客户端调用服务->服务调用从数据库获取数据的SomeManager类 下面是AuthorizationManager来过滤数据 public class SomeManager { public object[] Foo() { var data = Repository.GetData();

我们有一个服务,它公开客户端使用的所有数据,所有对象都有接口
iaauthorized

输出到客户端的数据需要根据用户凭据进行筛选

该流程类似于客户端调用服务->服务调用从数据库获取数据的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
    }

}

我曾经参与过一个项目,其中数据是通过用户的授权进行过滤的。使用的方法类似于“AuthorizationManager”方法。这需要编写大量的过滤代码,但它工作正常且易于理解

还有其他方法,你的想法当然可以实现。您所指的是使用面向方面编程(AOP)。这是Java世界中的一种常见方式,在.Net中也是可能的。PostSharp是一个第三方库,使这成为可能。我本人从未在工作项目中使用过PostSharp,但我目前正在使用它来学习AOP

下面是一个使用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;
        }
    }  
[可序列化]
公共类CollectionFilterSpect:OnMethodBoundaryAspect
{
公共重写void OnExit(MethodExecutionArgs args)
{
base.OnExit(args);
IQueryable retVal=(IQueryable)args.ReturnValue;
args.ReturnValue=从retVal中的r开始,其中r.LastName.Contains(“S”)选择r;
}
}  
要使用此方面,可以使用建议的语法,在方法上放置一个属性,指示应该对其进行筛选

[CollectionFilterAspect]
public IQueryable<Contact> GetByName(string value)
[CollectionFilterSpect]
公共IQueryable GetByName(字符串值)

虽然这个简短的演示说明了这当然是可能的,但它可能是一个好主意,也可能不是一个好主意。我没有在现实世界中使用此软件的经验,因此我无法帮助您。

谢谢您的评论,我不喜欢post sharp,因为它的代码注入。但是你的
IQueryable
的想法很好,过滤可以在。。。