La risposta al servizio web dovrebbe utilizzare una classe base o una classe generica?

3

Nel mio servizio web WCF RESTful ho qualcosa come il seguente oggetto di risposta.

public class WebResponse<T>
{ 
        public bool Success { get; set; }
        public T Data { get; set; }    
        public string ErrorMessage { get; set; }
}    

In questo modo posso catturare eventuali errori che si verificano durante la richiesta al servizio web. Separa anche l'oggetto dati dall'oggetto risposta. Un altro modo in cui questo può essere fatto è con una classe base di risposta come questa.

public abstract class WebResponseBase
{
        public bool Success { get; set; }
        public string ErrorMessage { get; set; }
}

public class CarResponse : WebResponseBase
{
        public string Manufacturer { get; set; }
        public string Make { get; set; }
}

Personalmente preferisco il primo metodo in quanto mi dà una chiara separazione dei dati e dello stato di risposta / errore e mi consente di restituire facilmente liste / array ecc. senza dover creare più classi.

Ci sono dei vantaggi nell'usare la classe base? Ci sono limitazioni all'utilizzo della classe generica?

    
posta Alex Wiese 22.02.2013 - 06:05
fonte

1 risposta

3

La risposta generica sembra effettivamente più chiara, ma richiede un numero leggermente maggiore di digitazione. Ad esempio, anziché:

var response = this.GetCar();
if (respose.Success)
{
    Debug.WriteLine(response.Manufacturer);
}

il chiamante deve scrivere:

var response = this.GetCar();
if (respose.Success && response.Data != null)
{
    Debug.WriteLine(response.Data.Manufacturer);
}

Tuttavia, personalmente preferirei usare i generici, poiché:

  1. Semplifica la comprensione di ciò che appartiene al protocollo e quali sono i dati effettivi,

  2. Permette di estendere o modificare il protocollo senza effettuare collisioni.

    Immagina che la macchina abbia proprietà Size . Successivamente, WebResponse dovrebbe implementare la proprietà Size per specificare la dimensione della risposta. Ora hai un problema con Car . Se i dati sono dinamici, non puoi nemmeno usare l'IDE per scoprire le collisioni e il compilatore non ti avviserà neanche.

Si noti inoltre che in base a MSDN , non si in grado di utilizzare i generici se vuoi che gli oggetti attraversino i contorni di un contesto (come in una situazione di una sandbox):

The current version of the common language runtime does not support generic ContextBoundObject types or nongeneric ContextBoundObject types that have generic methods.

    
risposta data 22.02.2013 - 06:32
fonte

Leggi altre domande sui tag