簡體   English   中英

使用帶有 Silverlight 的 RIA 服務時如何擴展實體?

[英]How Can I Extend A Entity When Using RIA Services With Silverlight?

在我的 Silverlight 解決方案的服務器端,我有 2 個項目。

  1. 提供 Silverlight 頁面的網站。
  2. 實體框架數據訪問層。

我有一個帶有 FirstName 和 LastName 屬性的實體。 我想添加一個可從 Silverlight 客戶端獲得的 FullName 屬性。

我已經添加了屬性:

namespace Server.DAL.Model
{
    public partial class Contact
    {
        public string FullName
        {
            get
            {
                return string.Format("{0} {1}", this.FirstName, this.LastName);
            }
        }
    }
}

從服務器端測試時,這個新屬性存在並且工作正常。 Silverlight 客戶端上不存在該屬性。 我嘗試使用Include屬性添加元數據 class 但由於字符串是原始類型,因此在編譯時出現以下錯誤:

無法使用 IncludeAttribute 標記實體類型“Contact”中的屬性“FullName”,因為“String”不是有效的實體類型。 實體類型不能是原始類型或字符串或 Guid 等簡單類型。

如何使 Silverlight 客戶端可以使用此屬性?

將 [DataMember] 添加到您的 FullName 屬性。 以下是向 ComplexTypes 添加方法/屬性的一些說明。 它們也可能適用於實體。 也許使用伙伴 class,我還沒有為實體嘗試過這個。

namespace Server.DAL.Model
{
    public partial class Contact
    {
        [DataMember]
        public string FullName
        {
            get
            {
                return string.Format("{0} {1}", this.FirstName, this.LastName);
            }
        }
    }
}

您應該將共享的代碼放入名為Contact.shared.cs的文件中。 WCF RIA 工具完全采用此代碼,並使用該代碼在 Silverlight 項目中創建一個文件。 然后,客戶端代碼可以訪問此成員以及在服務器項目中編譯的代碼的副本。

這是MSDN 文檔中有關共享代碼的更多信息。

我假設您正在使用 RIA 服務? 如果是這樣,問題在於 RIA 服務只會將服務器端類的結構復制到客戶端,而不是您在屬性或方法中編寫的任何自定義代碼。

好消息是,解決方案很簡單,您就快到了。 RIA 服務將客戶端類生成為部分類,就像 Entity Framework 在服務器上所做的那樣。 這意味着您可以使用部分類在 Silverlight 項目中擴展這些類,就像您在服務器項目中所做的那樣。

Simply move your class from the server project to the Silverlight project, make sure your namespace matches the namespace of the class RIA Services generated for you, and you'll be good to go.

祝你好運!

恕我直言,我認為將屬性添加到數據模型並不是最好的方法,因為我喜歡保持 model 清潔(並且不是特定於實現的,因此我的實體可以跨各種項目工作,而不會受到其他項目的干擾)。 我解決這個問題的方法是使用Extension Methods 這是使用擴展方法而不是將其添加到數據成員的完全相同的場景(來自我的代碼)。

namespace <MyAppName>.Services.Entities
{
  public static class UserExtension
  {

    public static String FullName(this User user)
    {
        return String.Format("{0} {1}", user.First, user.Last);

    }
  }
}

注意方法的參數和它的定義(即這不是一個正常的方法定義)。 我有一個“Common.dll” ,其中包含始終被引用的應用程序的基本例程......所以我將擴展方法放在 DLL 中。 我還確保擴展方法的命名空間與實體的命名空間完全匹配 如果您這樣做,該方法將出現在實體上,就好像它是實體的一部分一樣。

唯一的缺點是您必須將其實現為方法並且不能將其定義為屬性......這意味着沒有直接的數據綁定。 但是您的 ViewModel 或 IValueConverter 可以非常簡單地處理這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM