Как убедить ApiExplorer создать документацию для ExpandoObject?
Я создал очень аккуратный способ реализации метода PATCH для моего проекта Web.API, используя в качестве параметра 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)
{
...
}
Но я не знаю, с чего начать, любые идеи или предложения приветствуются.
1 ответ
Так что это было источником некоторых поздних вечеров, чтобы заставить Api Explorer играть вместе с нашим разработанным механизмом Http Patch. По правде говоря, я, вероятно, должен был бы сделать немного правильной записи, чтобы полностью объяснить механику всей идеи. Но для тех из вас, кто попал на эту страницу, потому что вы хотите, чтобы проводник Api использовал в документации другой тип, вот где вам нужно посмотреть:
Откройте 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)
Спасибо всем, кто нашел время, чтобы разобраться в проблеме.