2016-03-05 5 views
1

В моем методе действий контроллера api. Я использую Content Negotation для получения запроса. код:Override ExecuteAsync Метод, чтобы избежать повторения кода метода веб-Api Action

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); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^