gpt4 book ai didi

c# - 创建一种更好的方法来根据用户角色过滤数据

转载 作者:太空宇宙 更新时间:2023-11-03 14:03:50 24 4
gpt4 key购买 nike

我们有一个服务公开客户端使用的所有数据,所有对象都有接口(interface) 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);
}

}

如您所见,每个方法都需要过滤,

所以我要问你的是:我们可以构建一个基类来过滤具有输出数据某些属性的每个方法吗?它聪明吗?我们应该这样吗?简单的 wach 方法我们 shell 调用自动化?

你能想到更好的方法吗?

类似的东西:

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 是一个使这成为可能的第 3 方库。我自己从未在工作项目中使用过 PostSharp,但我目前正在使用它来学习 AOP。

下面是一个使用 PostSharp 实现的方面的示例,它会改变方法的返回值以过滤返回的数据。这是一个虚拟方面,我正在玩 PostSharp demo ,过滤返回的数据以仅返回那些包含字母“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)

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

关于c# - 创建一种更好的方法来根据用户角色过滤数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9982066/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com