【发布时间】:2011-12-04 03:00:29
【问题描述】:
我正在为 Web 应用程序中的模型实现访问控制的基础架构。该库有一个上下文类,控制器(可能还有视图)使用它来确定当前用户是否有权访问某个对象。为了将相关信息保持在目标对象附近,我决定将访问检查请求从上下文对象传递给模型本身。
为模型对象修改实施这种机制几乎是微不足道的。声明一个接口,比如ICheckModifyAccess;并在您的模型中实现它。删除检查也是如此。在这两种情况下,都可以询问模型实例是否可以修改或删除它们。
不幸的是,读取和创建操作并非如此。这些操作需要我向模型class提问。因此,为此使用接口不是一种选择。
我最终创建了一个属性CheckCreateAccessAttribute,然后最终使用该属性将静态函数标记为接口函数。然后,在我的上下文对象中,我可以使用反射来检查是否存在这样的标记函数,它是否与我期望的签名匹配,并最终调用它。万一有所不同,创建访问检查的方法是public bool CanCreate<TObj>();。支持访问控制的典型模型会在类中添加如下内容:
[CheckCreateAccess]
public static bool CanCreate()
{
return true;
}
我对 C# 还不是很流利,而且我总感觉自己做错了什么。你能推荐一个更优雅的选择吗?特别是,你能摆脱通过反射检查TObj吗?
【问题讨论】:
-
我不明白。为什么不能有一个模型实例来进行创建和读取操作?
-
优雅,主要原因。例如,我想创建一个所有用户的列表。如果我把它放在一个接口中,为了检查读取权限,我需要实例化一个虚拟用户,询问我是否可以使用这个实例读取,然后继续创建列表,如果我被允许的话。通过上面的方法,我问我是否可以读取这个类的对象,然后读取它们。
标签: c# interface static-methods