2016-02-17 2 views
0

Я создал очень аккуратный способ реализации метода PATCH для моего проекта Web.API с использованием ExpandoObject в качестве параметра. Как показано ниже:Как преследовать ApiExplorer для создания документации для ExpandoObject?

[HttpPatch, Route("api/employee/{id:int}")] 
public IHttpActionResult Update(int id, [FromBody] ExpandoObject employee) 
    { 
     var source = Repository.FindEmployeeById(id); 
     Patch(employee, source); 
     Repository.SaveEmployee(source); 
     return Ok(source); 
    } 

Однако при генерации документации ApiExplorer в недоумении относительно того, что делать с ExpandoObject, что вполне понятно. У кого-нибудь есть идеи о том, как манипулировать ApiExplorer, чтобы предоставить разумную документацию?

Моя идея состояла в том, чтобы возможно ввести новый атрибут, который указывает на реальный тип, который, как ожидается:

public IHttpActionResult Update(int id, [FromBody, Mimics(typeof(Employee))] ExpandoObject employee) 
{ 
    ... 
} 

Но я понятия не имею, где не начинать, какие-либо идеи или предложения приветствуются.

ответ

0

Так что это был источник некоторых поздних вечеров, чтобы заставить Api Explorer играть вместе с нашим разработанным механизмом Http Patch. По правде говоря, я, вероятно, должен немного поработать, чтобы полностью объяснить механику всей идеи. Но для тех из вас, кто приземлился на этой странице, потому что вы хотите, чтобы Апи исследователь использовать другой тип в документации, это, где вы должны смотреть:

Открыть HelpPageConfigurationExtensions.cs и найдите следующий метод:

//File: Areas/HelpPage/HelpPageConfigurationExtensions.cs 
private static void GenerateRequestModelDescription(HelpPageApiModel apiModel, ModelDescriptionGenerator modelGenerator, HelpPageSampleGenerator sampleGenerator) 
{ 
    .... 
} 

Это то место, где доступна информация о параметрах, а также предоставляет возможность заменить/заменить информацию о параметрах чем-то другим. Я закончил тем, выполнив следующие действия для обработки моего вопроса параметра ExpandoObject:

if (apiParameter.Source == ApiParameterSource.FromBody) 
{ 
    Type parameterType = apiParameter.ParameterDescriptor.ParameterType; 

    // do something different when dealing with parameters 
    // of type ExpandObject. 
    if (parameterType == typeof(ExpandoObject)) 
    { 
     // if a request-type-attribute is defined, assume the parameter 
     // is the supposed to mimic the type defined. 
     var requestTypeAttribute = apiParameter.ParameterDescriptor.GetCustomAttributes<RequestTypeAttribute>().FirstOrDefault(); 
     if (requestTypeAttribute != null) 
     { 
      parameterType = requestTypeAttribute.RequestType; 
     } 
    } 
} 

Просто, обратите внимание, что RequestTypeAttribute то, что я придумал. Моя конечная точка WebApi выглядит так:

public IHttpActionResult Update(int id, 
    [FromBody, RequestType(typeof(Employee))] ExpandoObject employee) 

Спасибо всем, кто нашел время, чтобы изучить проблему.

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