使用F#记录对象更改的方法

时间:2010-08-07 07:24:33

标签: f#

是否有一种聪明的方法来记录对F#中对象所做的更改?

我一直在研究F#,以此来构建一个通过网络复制自身的对象模型。我需要解决的一个任务是如何检测对象所做的更改,以便我只能向客户端发送更改

注意:我正在寻找其他而不是“实现INotifyPropertyChanged”或“做一些可以在C#中轻松完成的事情”的答案。如果这是解决F#中问题的唯一方法,那么F#就不是我要找的工具。

为何选择F#?因为我对C#中实现这种状态观察者模式的方式不满意。因此,我正在调查是否有一些优雅的方式以动态语言实现它,从F#开始。

5 个答案:

答案 0 :(得分:4)

F#中使用INotifyPropertyChanged的示例。

type DemoCustomer() =
    let mutable someValue = 0
    let propertyChanged = Event<_, _>()

    member this.MyProperty
        with get() = someValue
        and  set(x) =
            someValue <- x
            propertyChanged.Trigger(this, PropertyChangedEventArgs("MyProperty"))

    interface INotifyPropertyChanged with
        [<CLIEvent>]
        member this.PropertyChanged = propertyChanged.Publish

答案 1 :(得分:4)

不是在发生更改时检测和通知更改,而是可以使您的类不可变(例如,通过使用标准的不可变类型,如记录和联合,或通过使对象仅包含不可变的东西)。然后你可以编写一个“差异”一个类的两个实例的函数,并让一些代理按计划查找更改或基于某个触发器并将差异发送到另一端。

因为数据是不可变的,所以代理只需要保留指向它上次发送的版本的指针。 diffing函数本身可以手动为每个类编写,这将允许考虑数据属性的高效实现,或者您可以使用反射编写泛型函数。

答案 2 :(得分:3)

如何使用INotifyPropertyChanged界面?并引发导致数据被更改时复制的事件?

答案 3 :(得分:1)

我使用代理库:Castle DynamicProxyLinFuSpring.NET等。

使用代理库,您可以透明,无创地轻松implement INotifyPropertyChanged

答案 4 :(得分:0)

您可以使用反射来遍历对象字段并查看更改的内容吗?如果它们包含不可变的F#数据,则等式检查将获取更改。然后,您可以相对于最后发送的对象发送差异。