静态方法作为合同的一部分

时间:2011-10-09 20:59:01

标签: c# interface static-methods

我正在为Web应用程序中的模型实现访问控制的基础结构。该库有一个上下文类,控制器(也许是视图)用于确定当前用户是否可以访问某个对象。为了保持相关信息接近目标对象,我决定从上下文对象向模型本身传递访问检查请求。

为模型对象修改实现此机制几乎是微不足道的。声明一个接口,比如ICheckModifyAccess;并在您的模型中实现它。删除检查也是如此。在这两种情况下,都可以询问模型的实例是否可以修改或删除它们。

不幸的是,读取和创建操作并非如此。这些操作要求我向模型提出问题。因此,使用接口不是一种选择。

我最终创建了一个属性CheckCreateAccessAttribute,然后最终使用此属性将静态函数标记为接口函数。然后,在我的上下文对象中,我可以使用反射来检查是否存在这样的标记函数,如果它与我期望的签名匹配,并最终调用它。如果它有所不同,创建访问权限检查的方法是public bool CanCreate<TObj>();。支持访问控制的典型模型会在类中添加如下内容:

[CheckCreateAccess]
public static bool CanCreate()
{
    return true;
}

我对C#不是很流利,而且我有一种唠叨的感觉,我做错了什么。你能建议一个更优雅的选择吗?特别是,你可以通过反思去除TObj吗?

2 个答案:

答案 0 :(得分:2)

我认为您不应该询问某个特定用户是否可以修改他(除非修改权限是每个具体实体)。只需创建一个处理权限的类(或使用适当的现有类)。

这将消除您对静态类和反射的需求。

如果你有很多类型,每个类型都有自定义规则(即代码),你可以有一个通用的抽象类型(接口或抽象类),它能够检查一种类型的规则和一些存储库来检索特定的实例。

答案 1 :(得分:2)

听起来您已经在对象类中结合了关注点而不是separating them

“将相关信息保持在目标对象附近”的诱惑可能会引导您进入这种结构。

也许你可以改为在一个单独的类中处理权限,例如参见this article

相关问题