我发现了很多 DynamicProxy 示例,用于在对象中的属性更改时执行额外的工作,但是我如何不仅在拦截器中设置属性值(通过调用Proceed()
),而且如果在拦截过程中出现问题,还可以将其回滚本身?
这里的用例是这样的:我使用设置对象为系统的某些部分提供设置值,因此它们不必与配置后端一起使用。
这些对象也是INotifyPropertyChanged
,因此如果有人在运行时更改设置,拥有该对象的组件会收到有关更改的通知,并且可以即时执行重新配置。
PropertyChanged
因此,如果事件处理程序抛出异常(更改导致配置错误或无效),我需要做的是回滚属性的更改。
我想知道它是怎么做到的。
我最终都使用了INotifyPropertyChanging
(并稍微扩展了这个界面)和INotifyPropertyChanged
. 仅仅因为验证应该在实际设置之前进行,因为
- 事件的顺序是不确定的,因此设置的实际使用者可以在它被验证之前得到通知,当你只使用
INPChanged
- 总的来说,验证和消费是不同的,应该有不同的事件:一个在设置发生之前(以防止它发生),一个在之后 - 当属性的实际值已经更新时(代码按预期工作) .
当我现在看这个时,原始设计(问题所在)对我来说似乎很糟糕。