Jeśli dziedziczysz z bazy NegotitatedContentResult<T>
, jak wspomniano, i nie musisz przekształcać swojego content
(np. Chcesz tylko zwrócić ciąg znaków), nie musisz nadpisywać ExecuteAsync
metody.
Wszystko, co musisz zrobić, to podać odpowiednią definicję typu i konstruktora, który powie bazie, który kod stanu HTTP ma zwrócić. Wszystko inne po prostu działa.
Oto przykłady dla obu NotFound
i 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) { }
}
Następnie możesz utworzyć odpowiednie metody rozszerzające dla ApiController
(lub zrobić to w klasie bazowej, jeśli taką masz):
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);
}
A potem działają tak samo, jak metody wbudowane. Możesz zadzwonić do istniejącego NotFound()
lub możesz zadzwonić do nowego niestandardowego NotFound(myErrorMessage)
.
I oczywiście, można pozbyć się „zakodowane” typów łańcuchowych w definicjach Typ niestandardowy i pozostawić go rodzajowe, jeśli chcesz, ale wtedy może trzeba się martwić o ExecuteAsync
rzeczy, w zależności od Państwa<T>
rzeczywistości.
Można patrzeć na kod źródłowy dla NegotiatedContentResult<T>
zobaczyć wszystko, co robi. Nie ma w tym wiele.