Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Castle DynamicProxy回滚属性更改_C#_.net_Interceptor_Castle_Castle Dynamicproxy - Fatal编程技术网

C# 使用Castle DynamicProxy回滚属性更改

C# 使用Castle DynamicProxy回滚属性更改,c#,.net,interceptor,castle,castle-dynamicproxy,C#,.net,Interceptor,Castle,Castle Dynamicproxy,我发现了许多DynamicProxy的示例,它们用于在对象中的属性发生更改时执行额外的工作,但是我如何不仅在拦截器中设置属性值(通过调用procedure()),而且在拦截器本身出错时回滚它 这里的用例是这样的:我使用设置对象为系统的某些部分提供设置值,这样它们就不必使用配置后端 这些对象也是INotifyPropertyChanged,因此,如果有人在运行时更改设置,则包含该对象的组件会收到有关更改的通知,并可以动态执行重新配置 因此,如果PropertyChanged事件处理程序引发异常(该

我发现了许多DynamicProxy的示例,它们用于在对象中的属性发生更改时执行额外的工作,但是我如何不仅在拦截器中设置属性值(通过调用
procedure()
),而且在拦截器本身出错时回滚它

这里的用例是这样的:我使用设置对象为系统的某些部分提供设置值,这样它们就不必使用配置后端

这些对象也是
INotifyPropertyChanged
,因此,如果有人在运行时更改设置,则包含该对象的组件会收到有关更改的通知,并可以动态执行重新配置

因此,如果
PropertyChanged
事件处理程序引发异常(该更改导致配置错误或无效),我需要回滚属性的更改

我想知道怎样才能做到

我最后使用了
INotifyPropertyChanging
(并稍微扩展了这个接口)和
INotifyPropertyChanged
。只是因为验证应该在实际设置之前执行,因为

  • 事件顺序不确定,因此当您仅使用
    INPChanged
  • 总的来说,验证和使用是不同的,应该有不同的事件:一个在设置发生之前(以防止它发生),另一个在属性的实际值已经更新之后(以使代码按预期工作)

当我现在看到这一点时,我觉得原来的设计(问题是关于这个)很糟糕。

我建议不要走“回滚”值的路线,而是允许开始属性更改。允许您的模型处于无效状态。从那里,您可以让其他代码根据状态阻止“保存”或“更新”(我假设您就是这样做的)。@m-y是的,我在设置值之前验证了该值,如果验证失败,则引发异常。因此,我没有安静地回滚,而是显著地指示执行错误代码的位置,并防止其在无效状态下继续。(因此添加了INotifyPropertyChanging契约。)我意识到这一点,但我的建议是不要有任何类型的回滚机制。相反,允许模型保持无效状态,并使用IDataErrorInfo将无效状态中继到视图。我建议不要采用“回滚”值的方式,而是允许开始属性更改。允许您的模型处于无效状态。从那里,您可以让其他代码根据状态阻止“保存”或“更新”(我假设您就是这样做的)。@m-y是的,我在设置值之前验证了该值,如果验证失败,则引发异常。因此,我没有安静地回滚,而是显著地指示执行错误代码的位置,并防止其在无效状态下继续。(因此添加了INotifyPropertyChanging契约。)我意识到这一点,但我的建议是不要有任何类型的回滚机制。相反,允许模型保持无效状态,并使用IDataErrorInfo将无效状态中继到视图。