Se erediti dalla base NegotitatedContentResult<T>
, come accennato, e non hai bisogno di trasformare il tuo content
(ad esempio, vuoi solo restituire una stringa), allora non hai bisogno di sovrascrivere il ExecuteAsync
metodo.
Tutto quello che devi fare è fornire una definizione di tipo appropriata e un costruttore che indichi alla base quale codice di stato HTTP restituire. Tutto il resto funziona.
Ecco alcuni esempi per entrambi NotFound
e InternalServerError
:
public class NotFoundNegotiatedContentResult : NegotiatedContentResult<string>
{
public NotFoundNegotiatedContentResult(string content, ApiController controller)
: base(HttpStatusCode.NotFound, content, controller) { }
}
public class InternalServerErrorNegotiatedContentResult : NegotiatedContentResult<string>
{
public InternalServerErrorNegotiatedContentResult(string content, ApiController controller)
: base(HttpStatusCode.InternalServerError, content, controller) { }
}
E poi puoi creare metodi di estensione corrispondenti per ApiController
(o farlo in una classe base se ne hai uno):
public static NotFoundNegotiatedContentResult NotFound(this ApiController controller, string message)
{
return new NotFoundNegotiatedContentResult(message, controller);
}
public static InternalServerErrorNegotiatedContentResult InternalServerError(this ApiController controller, string message)
{
return new InternalServerErrorNegotiatedContentResult(message, controller);
}
E poi funzionano proprio come i metodi integrati. Puoi chiamare l'esistente NotFound()
o puoi chiamare la tua nuova abitudine NotFound(myErrorMessage)
.
E, naturalmente, puoi sbarazzarti dei tipi di stringa "hard-coded" nelle definizioni dei tipi personalizzati e lasciarli generici se vuoi, ma poi potresti doverti preoccupare delle ExecuteAsync
cose, a seconda di cosa sei <T>
effettivamente.
Puoi controllare il codice sorgente per NegotiatedContentResult<T>
vedere tutto ciò che fa. Non c'è molto da fare.