部分方法OnCreated在预期时未调用

时间:2011-12-06 00:16:04

标签: silverlight wcf-ria-services

我在部分类中扩展了我在Silverlight客户端的域类。具体来说,我添加了一个RelayCommand属性,我将绑定一个按钮。 RelayCommand属性需要初始化,因此看起来最好的地方是OnCreated部分方法。

但是我收集到,当服务器上的对象在客户端实现时,它的构造函数没有被调用(这看起来完全错误了!)因为它的构造函数没有被调用,所以它不会调用OnCreated方法。

是否存在配置或约定,以便在对象具体化时调用此OnCreated部分方法?

2 个答案:

答案 0 :(得分:7)

DataContractSerialization不会调用它反序列化的对象的构造函数。之所以做出这样的决定,是因为.NET中的先前序列化方法必须始终在任何要序列化的对象上具有默认构造函数,这是一个问题。这不是RIA Services特有的,它是在WCF本身创建时做出的设计决策,并且没有配置可以更改它。

您可以在http://blogs.msdn.com/b/carlosfigueira/archive/2011/09/06/wcf-extensibility-serialization-callbacks.aspx找到更多信息,以及如何使用[OnDeserialized]复制被调用构造函数的效果的示例。

但是,还有第二个问题可能会导致您遇到问题。实体一直在构建。例如,每次调用TEntity.GetOriginal时,都会创建一个新的分离实体并从该方法返回。这使得尝试执行诸如配置RelayCommand潜在的性能和稳定性问题。您可能最好在DataService或ViewModel级别配置RelayCommands,而不是在实体本身内部。

答案 1 :(得分:5)

仅在使用默认构造函数实例化实体时调用部分方法OnCreated()。

如果要初始化已加载的实体,则必须覆盖OnLoaded方法。传递给它的布尔值指定实体是否第一次加载。