共用方式為


ComplexObject 類別

適用於所有複雜物件的基底類別。

命名空間: System.ServiceModel.DomainServices.Client
組件: System.ServiceModel.DomainServices.Client (於 system.servicemodel.domainservices.client.dll)

使用方式

'用途
Dim instance As ComplexObject

語法

'宣告
<DataContractAttribute> _
Public MustInherit Class ComplexObject
    Implements INotifyPropertyChanged, IEditableObject, INotifyDataErrorInfo
[DataContractAttribute] 
public abstract class ComplexObject : INotifyPropertyChanged, IEditableObject, INotifyDataErrorInfo
[DataContractAttribute] 
public ref class ComplexObject abstract : INotifyPropertyChanged, IEditableObject, INotifyDataErrorInfo
/** @attribute DataContractAttribute() */ 
public abstract class ComplexObject implements INotifyPropertyChanged, IEditableObject, 
    INotifyDataErrorInfo
DataContractAttribute 
public abstract class ComplexObject implements INotifyPropertyChanged, IEditableObject, 
    INotifyDataErrorInfo

備註

WCF RIA Services 中的複雜物件型別是結構化自訂使用者型別,其使用方式類似基底型別。架構為複雜型別提供了大量實體這類的功能 (例如豐富型用戶端程式碼產生),而且大部分複雜型別的架構行為與該實體相同或非常類似。但 ComplexObject 在許多重要方面與 Entity 不同。特別的是,複雜型別並沒有識別。這表示,它們並沒有標記為 KeyAttribute 的成員。因此用戶端無法像對實體那樣為它們進行識別快取。複雜型別不能從多個上層執行個體共用或參考,而且複雜型別不支援繼承。

假設您具有含有 Address 型別之成員的實體型別 Customer

public class Address
{
    public string AddressLine1 { get;set }
    public string City { get;set }
    public string Region { get;set }
    public string PostalCode { get;set }
    public string Country { get;set }
}

public class Customer
{
    [Key]
    public string CustomerID { get;set; }
    public string CompanyName { get;set }
    public string ContactName { get;set }

    public Address HomeAddress { get;set; }
}

這些型別會導致對應之產生的用戶端型別:

public class Address : ComplexObject
{
    public string AddressLine1 { . . . }
    public string City { . . . }
    public string Region { . . . }
    public string PostalCode { . . . }
    public string Country { . . . }
}

public class Customer : Entity
{
    [Key]
    public string CustomerID { . . . }
    public string CompanyName { . . . }
    public string ContactName { . . . }

    public Address HomeAddress { . . . }
}

請注意,Address 是由 ComplexObject 衍生。

程式碼產生

為複雜型別產生的用戶端 Proxy 與為實體而產生的用戶端 Proxy 非常類似。這包含部分擴充性方法、驗證中繼資料等。程式碼產生的複雜型別從 ComplexObject 基底類別衍生。為複雜型別成員產生的屬性 setter 邏輯以及複雜型別的成員會遵循用於實體之相同的屬性模式。

中繼資料

如同實體一樣,您可以透過協同類別將其他中繼資料套用至複雜型別,該中繼資料將會在整個系統中流動。同樣地,在您使用支援複雜型別的資料存取層 (DAL) 的情況下,仍然會套用 DAL 中繼資料 (例如根據 Entity Framework 模型為成員推斷 StringLengthAttribute)。複雜型別參與中繼資料管線的方式與實體相同。

驗證

針對複雜型別成員執行的屬性 setter 驗證與針對實體成員執行的方式相同。此外,巢狀複雜型別成員的驗證錯誤會散佈到內含項目階層架構上。實體複雜型別成員的兩個層上都會執行深入提交時間驗證。在所有情況下,巢狀驗證錯誤會報告為階層架構上每一個父代的錯誤。例如,如果 Customer.ContactInfo.HomeAddress.PostalCode 成員無效,則該驗證錯誤將會以 CustomerContactInfoHomeAddress 執行個體的驗證錯誤形式出現。將會在每個層級對 ValidationResult 中的成員名稱進行適當的路徑傳送。

變更追蹤

單一實體複雜型別成員 (例如 Customer.Address) 會充分參與變更追蹤以及 Accept/RejectChanges 管線的其餘部分。巢狀複雜型別成員變更時,這些變更會以階層方式向上回報,因而造成父實體變更。如果實體上拒絕變更,則所有的巢狀複雜型別變更將還原。就概念而言,系統處理巢狀複雜型別成員的方式與處理最上層非複雜型別實體屬性相同。

系統不會深入追蹤集合成員中的複雜型別 (例如 Customer.PhoneNumbers)。將於提交時間對它們進行深入驗證,但成員已在集合中的複雜型別執行個體上設定,因此實體上不會引發驗證錯誤。而且父實體不會追蹤集合中的執行個體是否已修改、新增或移除。若要修改複雜型別成員的內容,新的集合執行個體必須指派給成員。

編輯工作階段

實體複雜型別成員充分參與透過 IEditableObject 介面啟動的實體編輯工作階段。如果實體上執行了 BeginEdit,則實體的狀態快照會以遞迴的方式包含所有的巢狀複雜型別狀態。同樣地,如果執行了 CancelEdit/EndEdit,則會以遞迴的方式套用變更。 ComplexObject 本身會實作 IEditableObject,因此您可以取得針對不是由實體裝載之複雜型別的完整編輯工作階段支援。

序列化

複雜型別的成員永遠會根據 DataContract/DataMember 註解深入序列化。此與實體關聯不同,其序列化由 IncludeAttribute 的應用程式所控制。

繼承階層

System.Object
  System.ServiceModel.DomainServices.Client.ComplexObject

執行緒安全性

任何這個類型的公用靜態 (在 Visual Basic 中為 共用) 成員都具備執行緒安全。 不保證任何執行個體成員安全執行緒。

平台

開發平台

Windows XP Home Edition, Windows XP Professional, Windows Server 2003 、Windows Server 2008 和 Windows 2000

目標平台

Change History

另請參閱

參考

ComplexObject 成員
System.ServiceModel.DomainServices.Client 命名空間