Nếu bạn kế thừa từ cơ sở NegotitatedContentResult<T>
, như đã đề cập và bạn không cần phải chuyển đổi content
(ví dụ: bạn chỉ muốn trả về một chuỗi), thì bạn không cần ghi đè ExecuteAsync
phương thức.
Tất cả những gì bạn cần làm là cung cấp một định nghĩa kiểu thích hợp và một hàm tạo cho cơ sở biết Mã trạng thái HTTP nào sẽ trả về. Mọi thứ khác chỉ hoạt động.
Dưới đây là các ví dụ cho cả hai NotFound
và 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) { }
}
Và sau đó, bạn có thể tạo các phương thức mở rộng tương ứng cho ApiController
(hoặc làm điều đó trong một lớp cơ sở nếu bạn có):
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);
}
Và sau đó chúng hoạt động giống như các phương thức tích hợp sẵn. Bạn có thể gọi hiện tại NotFound()
hoặc có thể gọi tùy chỉnh mới của bạnNotFound(myErrorMessage)
.
Và tất nhiên, bạn có thể loại bỏ các loại chuỗi "mã hóa cứng" trong định nghĩa loại tùy chỉnh và để nó chung chung nếu bạn muốn, nhưng sau đó bạn có thể phải lo lắng về những ExecuteAsync
thứ này, tùy thuộc vào<T>
thực tế .
Bạn có thể xem qua các mã nguồn cho NegotiatedContentResult<T>
thấy tất cả nó. Không có gì nhiều cho nó.