代码之家  ›  专栏  ›  技术社区  ›  Sisyphus

属性的同一实例用于多方法调用[关闭]

  •  -2
  • Sisyphus  · 技术社区  · 7 年前

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

    1 回复  |  直到 7 年前
        1
  •  2
  •   Sefe    7 年前

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

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