2013-03-23 48 views
0

我正在使用Silverlight和WCF RIA服務。 我的實體模型中有一個名爲Activation的課程。它具有以下屬性:Code1Code2以及其他屬性。調用或命名更新?

在我的silverlight客戶端上,我需要發送一個Activation到服務器,從中選擇與其關聯的對象的值並填充Code1Code1屬性。 E.g:

Public Sub ServerMethod(ByRef myActivation as Activation) 
    Dim x as Integer = myActivation.Licence.NumberOfDays 
    Dim y as Integer = myActivation.Product.ProductSeed 
    myActivation.Code1 = GetCode1(x,y) 
    myActivation.Code2 = GetCode2(x,y) 
End Sub 

注意,激活代碼是保存到數據庫,他們只是回到客戶端,用戶可以決定是否保存,如果他們從那裏似的。

使用WCF RIA Services實現此目的的最佳方法是什麼?起初,我認爲域服務中的命名更新可能會完成這項工作,但似乎沒有異步回調。

任何想法將不勝感激!

+1

你爲什麼與'C#'標籤呢? – 2013-03-23 18:32:33

回答

0

這正是InvokeAttribute的意思,只是把它放在你的「ServerMethod」上。
關於異步,wcf ria服務中的每個呼叫都是異步的,如果想要通知您必須爲該方法提供回調。
編輯: 我沒有看到你的問題,你需要通過「協會」屬性沿線。在這種情況下,NamedUpdate雖然在語義上不正確,但可能更容易。請記住,您的上下文必須是「乾淨的」,否則您會向服務器提交意外更改(請記住,您必須調用DomainContext上的SubmitChanges)。
如果您更喜歡使用InvokeAttribute(這是我的方式),那麼,正如您所指出的那樣,將「已更新」實體返回給客戶端並解決關聯問題,使用序列化您自己,即序列化您的實體並將其發送到服務器,而不是反序列化服務器端並在將其返回給客戶端之前重新序列化,最終將其反序列化。
我附上一段代碼,我使用服務器和客戶端,我用這個目的。

public static class Serialization 
{ 
    public static string Serialize<T>(T obj) 
    { 
     //Create a stream to serialize the object to. 
     var ms = new MemoryStream(); 

     // Serializer the User object to the stream. 
     var ser = new DataContractSerializer(typeof (T)); 


     ser.WriteObject(ms, obj); 
     byte[] array = ms.ToArray(); 
     ms.Close(); 
     return Encoding.UTF8.GetString(array, 0, array.Length); 
    } 

    public static T Deserialize<T>(string obj) where T : class 
    { 
     if (obj == null) 
      return null; 
     var serializer = new DataContractSerializer(typeof (T)); 
     var stream = new MemoryStream(Encoding.UTF8.GetBytes(obj)); 
     var result = serializer.ReadObject(stream) as T; 
     return result; 
    } 
} 

HTH

+0

感謝您的回覆。我嘗試使用Invoke屬性裝飾我的ServerMethod。但是,當我在myActivation.Code1 =「blah」之類的參數中設置方法內的屬性時,返回客戶端時不會顯示此更改。我發現的唯一方法是返回myActivation,當我們回到客戶端時,將所有需要的值從返回值複製到原始激活。這是唯一的方法嗎? – Kurren 2013-03-25 16:31:49

+0

此外,它似乎我不能訪問invoke方法內的實體導航屬性 – Kurren 2013-03-25 16:34:09