2016-02-17 49 views
0

我創建實施PATCH方法,通過利用一個ExpandoObject作爲參數我Web.API項目的一個非常簡潔的方式。如下圖所示:如何pursuade的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資源管理器以及我們發達的Http補丁機制發揮。說實話,我可能應該做一些適當的寫入到全解釋整個想法背後的機制。但是,對於那些你們誰這個頁面,因爲你希望將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) 

謝謝大家花時間研究這個問題。