【问题标题】:Same instance of the Attribute is used for multiple method call [closed]同一属性实例用于多个方法调用[关闭]
【发布时间】:2017-12-13 13:17:42
【问题描述】:

我在 MVC 中创建一个动作过滤器,我创建了一个继承自 ActionFilterAttribute 类的新属性,并实现了 OnActionExecuted 方法。然后我用这个新属性装饰了一个动作。当我第一次调用该操作时,一切都很好,然后调用 Attribute 的构造函数,然后调用 OnActionExecuted 方法。当我第二次调用这个相同的action时,发现没有调用Attribute的构造函数,并且仍然保留了第一次调用Action时设置的内部属性成员的状态,这显然意味着相同属性的实例用于对操作的所有调用。有没有办法为每个属性调用强制一个新实例?

【问题讨论】:

  • 第一次调用构造函数来构建属性,一旦你访问了动作就不会再次调用,因为属性已经构造好了,有点像静态构造函数。这是一个猜测,请提供代码。
  • 你能提供一些代码吗?很难想象你到底想达到什么目标以及你被困在哪里。

标签: c# asp.net-mvc attributes action-filter


【解决方案1】:

当您将属性附加到类型、成员、参数等时,您正在注释属性目标的元数据。在您的情况下,您将属性应用于方法,因此它在元数据级别附加到该方法,而不是附加到调用该方法的实例。这意味着您将为应用它的每个方法获得一个新的属性实例,而不是为每个方法和定义目标方法的类的每个实例。

由于元数据没有可以更改的状态,因此如果正确使用该属性,也不会更改状态。您无法更改属性的工作方式,因此您必须以不依赖于内部状态的方式实现属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-19
    • 2019-11-26
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多