Переопределите метод ExecuteAsync, чтобы избежать повторения кода метода действий Web Api.
В моем методе действия контроллера api. Я использую Content Negotation для запроса на получение. код:
IContentNegotiator negotiator = this.Configuration.Services.GetContentNegotiator();
ContentNegotiationResult result = negotiator.Negotiate(typeof(OfficeDetailsDto), this.Request, this.Configuration.Formatters);
if (result == null)
{
var responseErr = new HttpResponseMessage(HttpStatusCode.NotAcceptable);
throw new HttpResponseException(responseErr);
}
Но теперь я хочу создать контроллер BaseAPIController, унаследовав ApiController, и хочу переопределить метод базового класса, чтобы иметь приведенный выше код, чтобы мне не приходилось писать этот код снова и снова во всех моих классах контроллеров. Это также сделает мой метод действия контроллера тонким.
Может ли кто-нибудь дать мне любое предложение или образец, пожалуйста.
1 ответ
ApiController уже предоставляет возможность обрабатывать согласование содержимого из коробки, но вы можете создать свои собственные универсальные методы, которые вы можете вызывать из унаследованных контроллеров, если вы действительно хотите настроить процесс согласования содержимого.
Ваш BaseAPIController
public abstract class BaseAPIController : ApiController {
protected virtual HttpResponseMessage NegotiatedContent<T>(HttpStatusCode statusCode, T content) {
var type = typeof(T);
var request = this.Request;
var formatters = this.Configuration.Formatters;
var negotiator = this.Configuration.Services.GetContentNegotiator();
var result = negotiator.Negotiate(type, request, formatters );
if (result == null) {
var response = new HttpResponseMessage(HttpStatusCode.NotAcceptable);
throw new HttpResponseException(response));
}
return new HttpResponseMessage() {
StatusCode = statusCode,
Content = new ObjectContent<T>(
content, // What we are serializing
result.Formatter, // The media formatter
result.MediaType.MediaType // The MIME type
)
};
}
}
Этот код эквивалентен тому, что ApiController
обеспечивает автоматически.
Потенциал OfficeDetailsController
с гораздо более тонким методом действия
public class OfficeDetailsController : BaseAPIController {
public HttpResponseMessage GetOfficeDetails(int id) {
var item = new OfficeDetailsDto() { Id = id, Name = "Gizmo"};
// what ever else needs to be done to the item
// ...
return NegotiatedContent(HttpStatusCode.Ok, item);
}
}
Вот пример того же ApiController
по умолчанию.
public class OfficeDetailsController : ApiController {
public IHttpActionResult GetOfficeDetails(int id) {
var item = new OfficeDetailsDto() { Id = id, Name = "Gizmo"};
// what ever else needs to be done to the item
// ...
return Ok(item);
}
}