2010-08-19 19 views
12

Sono in corso alcune difficoltà con i servizi RIA WCF simili al problema specificato in this thread.Servizi Ria Passaggio dell'oggetto complesso come parametro a un metodo di servizio del dominio query

Il metodo di servizio di dominio che sto creando (un metodo di Query) dovrebbe utilizzare un parametro oggetto complesso. esempio metodo DomainService:

public ComplexObjectResult GetComplexObject(ComplexObjectParameter test) 
    { 
     //do stuff 
    } 

l'oggetto di parametro:

public class ComplexObjectParameter 
{   

    [Key] 
    public decimal ID { get; set; } 

    ... other fields 
} 

ottengo questo errore di compilazione: errore 70 Parametro 'test' di entrata funzionamento del dominio 'GetComplexObject' deve essere uno dei serializable predefinita tipi.

Dopo alcune ricerche sul web ho trovato this msdn thread. Si afferma che questa è una limitazione dei servizi RIA e il thread non specifica soluzioni alternative decenti.

Ora sembra che ci siano alcune soluzioni sporchi:

  • Modificare il parametro complesso di tipo stringa e Serialize/deserializzare il parameterobject noi stessi che trovo una soluzione molto hacky.

  • Utilizzare il tag [Invoke] nel metodo di servizio del dominio e perdere tutte le funzionalità di tracciamento RIA, per le quali sto utilizzando RIA in primo luogo.

Esistono alternative per le soluzioni citate che presentano meno svantaggi? Qualcuno ha trovato una soluzione più elegante per questo problema?

Grazie

+0

Sono andato con la tua seconda opzione Stephane. I tipi complessi che ho restituito erano di sola lettura sul client, quindi la perdita della funzionalità di tracciamento non era un problema per me. Considera di mettere in soluzione risposte potenziali (anche sporche) ... avrei votato sia per la domanda che per la risposta! –

risposta

6

soluzione alternativa Dirty Three, è quello di utilizzare l'attributo [Invoke] e aggiungere un metodo per il servizio di dominio per esporre il "tipo complesso", che informa le attrezzature WCF RIA per creare l'entità sul client -side:

public ComplexObjectParameter ExposeComplexObjectParameter() 
{ 
    throw new NotSupportedException(); 
} 

ho messo NotSupportedException nei miei metodi di servizio del dominio per evitare gli errori silenti se il metodo viene mai chiamato in remoto.

Non sono sicuro di come questa soluzione influenzi il problema di perdere "tutte le funzionalità di tracciabilità RIA". Non risponde come creare una query componibile utilizzando un tipo complesso come parametro.

È sporco, ma astrae il problema più vicino all'origine del problema. Il codice chiamante e ricevente è più pulito. Ciò mantiene l '"eleganza" al livello più alto mentre spinge lo sporco verso il basso.

+1

Ciao Ed, avevo già creato un metodo Query fasullo per avere l'oggetto complexparameter generato sul clientide.Fa parte della soluzione dirty 2. Ma alla fine ho utilizzato un'altra soluzione: persistere il parametro dell'oggetto complesso nel database e quindi passare l'id quando si esegue una query. Questa soluzione potrebbe non essere applicabile a tutte le persone che hanno riscontrato questo problema, ma è adatta al mio caso. Grazie per i tuoi sforzi. – Stephane

+0

Un voto per spiegare che è necessario "esporre" il tipo complesso. –

2

Super vecchia domanda, lo so. Ma mi sono appena morso e ho trovato una risposta. Da MSDN Docs su ComplexObject:

But a ComplexObject differs from an Entity in important ways. In particular, complex types do not have identities. This means that they do not have members marked with the KeyAttribute and so clients cannot do identity caching for them as it does for entities. Complex types cannot be shared or referenced from multiple parent instances and they do not support inheritance.

Problemi correlati