Compartir a través de


Clase ComplexObject

Clase base para todos los objetos complejos.

Espacio de nombres: System.ServiceModel.DomainServices.Client
Ensamblado: System.ServiceModel.DomainServices.Client (en system.servicemodel.domainservices.client.dll)

Uso

'Uso
Dim instance As ComplexObject

Sintaxis

'Declaración
<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

Notas

Un tipo de objeto complejo en WCF RIA Services es un tipo de usuario personalizado y estructural que se puede usar como tipo base. El marco de trabajo proporciona una alta funcionalidad similar a la de las entidades como generación de código cliente enriquecida para tipos complejos y gran parte del comportamiento del marco de trabajo para tipos complejos es el mismo o muy similar al de las entidades. Pero ComplexObject difiere de Entity en varios aspectos importantes. En particular, los tipos complejos no tienen identidades. Esto significa que no tienen miembros marcados con KeyAttribute y, por lo tanto, los clientes no pueden realizar el almacenamiento en caché de identidades para ellos tal y como lo hacen para las entidades. Los tipos complejos no se pueden compartir, no se puede hacer referencia a ellos desde varias instancias primarias y no admiten la herencia.

Supongamos que tiene un tipo de entidad Customer con un miembro del tipo Address:

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; }
}

Estos tipos resultarán en los correspondientes tipos de cliente generados:

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 { . . . }
}

Observe que Address deriva de ComplexObject.

Generación de código

Los proxy cliente generados para tipos complejos son muy similares a los generados para entidades. Aquí se incluyen métodos de extensibilidad parcial, metadatos de validación, etc. Los tipos complejos generados por código derivan de la clase base ComplexObject. La lógica del establecedor de propiedades generada para miembros de tipo complejo y miembros de tipo complejo sigue los mismos patrones de propiedades utilizados para entidades.

Metadatos

En lo que concierne a las entidades, puede aplicar metadatos adicionales a los tipos complejos del servidor mediante clases relacionadas y dichos metadatos fluirán a través del sistema. De manera similar, en los casos en los que esté usando una capa de acceso a datos (DAL) que admita tipos complejos, los metadatos DAL se aplicarán también (p. ej., deduciendo StringLengthAttribute para miembros basados en el modelo de Entity Framework). Los tipos complejos participan en la canalización de metadatos de la misma manera que las entidades.

Validación

Las validaciones del establecedor de propiedades se realizan para miembros de tipo complejo de la misma manera que para miembros de entidad. Además, los errores de validación para miembros de tipo complejo anidado se propagan por la jerarquía de inclusión. La validación exhaustiva de tiempo de envío se realiza en ambos niveles para miembros de tipo complejo de entidad. En todos los casos, se informará del error de validación anidado como un error en cada elemento primario en la jerarquía. Por ejemplo, si el miembro Customer.ContactInfo.HomeAddress.PostalCode no es válido, ese error de validación se mostrará en los errores de validación de las instancias Customer, ContactInfo y HomeAddress. El nombre o los nombres de miembro en ValidationResult se enrutarán de manera apropiada en cada nivel.

Seguimiento de los cambios

Los miembros de tipo complejo de entidad singleton (p. ej., Customer.Address) participan completamente en el seguimiento de cambios y en el resto de la canalización Accept/RejectChanges. Al mismo tiempo que se modifican los miembros de tipo complejo anidado, dichos cambios se informan en toda la contención de manera jerárquica provocando la modificación de la entidad primaria. Si los cambios se rechazan en la entidad, se revierten todos los cambios de tipo complejo anidado. Conceptualmente, el sistema trata a los miembros de tipo complejo anidado de la misma manera que a las propiedades de entidad de nivel superior que no son de tipo complejo.

Para los tipos complejos en miembros de la colección no se realiza un seguimiento exhaustivo (p. ej., Customer.PhoneNumbers). Se validarán completamente durante el tiempo de envío, pero los errores de validación no se generan en la entidad mientras los miembros se establecen en instancias de tipo complejo en la colección, y la entidad primaria no realiza un seguimiento de si se modifican, agregan o quitan instancias en la colección. Para modificar el contenido de un miembro de colección de tipo complejo, se debe asignar una nueva instancia de colección al miembro.

Sesiones de edición

Los miembros de tipo complejo de entidad participan completamente en sesiones de edición de entidades iniciadas a través de la interfaz IEditableObject. Si se realiza un BeginEdit en una entidad, la captura de estado para la entidad incluye todos los estados de tipo complejo anidado de manera recursiva. De manera similar, si se realizan CancelEdit/EndEdit, los cambios se aplican de manera recursiva. ComplexObject en sí implementa IEditableObject, por lo que se obtiene compatibilidad completa con la sesión de edición para tipos complejos que no hospedan las entidades.

Serialización

Los miembros de tipo complejo siempre se serializan exhaustivamente en función de las anotaciones DataContract/DataMember. Esto contrasta con las asociaciones de entidad, cuya serialización está gobernada por la aplicación de IncludeAttribute.

Jerarquía de herencia

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

Seguridad para subprocesos

Cualquier miembro estático público (Compartidos en Visual Basic) de este tipo es seguro para subprocesos. No se garantiza que los miembros de instancia sean seguros para subprocesos.

Plataformas

Plataformas de desarrollo

Microsoft Windows XP Home Edition, Windows XP Professional, Windows Server 2003 , Windows Server 2008 y Windows 2000

Plataformas de destino

Change History

Vea también

Referencia

Miembros ComplexObject
Espacio de nombres System.ServiceModel.DomainServices.Client