【问题标题】:Colliding aspects in postsharppostsharp中的碰撞方面
【发布时间】:2018-04-05 14:15:40
【问题描述】:

我正在通过使用 [NotifyPropertyChanged] 属性装饰我的业务类来为 INotifyPropertyChanged 使用 PostSharp 解决方案。

一切正常。

现在我编写了一个处理属性更改的自定义方面,以便在某些特殊属性更改时设置一些自定义标志。这个方面被命名为 [HandlePropertyChanged] 并且单独使用时可以工作。

现在我尝试结合使用这两个方面。正如我在 PostSharp 页面上阅读的那样,我可以使用

手动订购它们以确保固定顺序
  [NotifyPropertyChanged(AspectPriority = 0)]
  [HandlePropertyChanged(AspectPriority = 1)]

在这种情况下,我可以构建我的解决方案,但是因为“NotifyPropertyChanged”在“HandlePropertyChanged”之前运行,所以我的属性更改已经完成,并且自定义逻辑无法正确运行。

如果我试试这个

  [HandlePropertyChanged(AspectPriority = 0)]
  [NotifyPropertyChanged(AspectPriority = 1)]

我的构建失败并出现文本底部的错误(见下文)。

最好的办法是简单地做 NotifyPropertyChanged 在我的自定义方面所做的事情,而忘记 PostSharp 方面

这可能吗?

0:错误 C:\Source\WAVE\WAVE.Data.Contracts\Entities\Base\EntityBase.cs (17,16) PS0115:“TopMotive.WAVE.Data.Contracts.Entities.Base.EntityBase”上的冲突方面`1":根据方面依赖关系,转换“方面 PostSharp.Patterns.Model.NotifyPropertyChangedAttribute 的实例化”应位于转换“实例化字段“PostSharp.Patterns.Model.NotifyPropertyChangedAttribute/LocationBindings”的绑定集合之前和之后。”。

【问题讨论】:

  • PostSharp 模型库中包含的 NotifyPropertyChanged 方面非常复杂,完全重新实现它可能不经济。我相信首先寻找方面排序的解决方案是值得的。您的 HandlePropertyChanged 方面是什么样的?你在使用位置拦截吗?还有其他建议吗?最好有一个示例来演示该问题。
  • 是的,我正在使用位置拦截,这可能导致了问题。只是为了确保:是否有机会获得 NotifyPropertyChanged 的​​源代码?也许我可以在那里添加我的东西......
  • PostSharp 团队调查了 NPC 方面排序问题并提交了相应的内部错误。一旦错误修复,我们将通知您。同时,您可以尝试使用方面依赖项而不是 AspectPriority 来对方面进行排序 (doc.postsharp.net/aspect-dependencies)。

标签: postsharp


【解决方案1】:

此错误已在 PostSharp 5.0.52 和 PostSharp 6.0.16 RC 中修复。

【讨论】:

    【解决方案2】:

    尝试更好的免费替代方案:Stepen Cleary 的计算属性。 https://github.com/StephenCleary/CalculatedProperties/blob/master/README.md

    我在生产中都使用过,发现它比 PostSharp 的方面要好得多。

    也来自 PostSharp 文档:

    "如果一个属性 getter 从其类或委托中调用虚拟方法,或引用另一个对象的属性(不使用规范形式 this.field.Property),PostSharp 将生成错误,因为它无法解析此类依赖项在构建时。当您的属性 getter 包含复杂的数据流时,同样的限制也适用,例如循环或对其他类的方法(属性 getter 除外)的调用。 发生这种情况时,您可以重构代码以便 PostSharp 自动分析它,或者您可以接管分析代码的责任”

    这些限制均不适用于计算属性。它可以执行循环、虚拟方法、LINQ to objects,基本上任何你能想象到的运行时依赖关系都不管多么间接。依赖关系图在运行时自行重新连接,无需任何仪式即可工作。它们也很快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-28
      相关资源
      最近更新 更多