Allow to user same method name in same application service for API model.

pull/96/head
Halil İbrahim Kalkan 8 years ago
parent bd55cc97bc
commit bc68b01bc5

@ -1,6 +1,8 @@
using System;
using System.Linq;
using System.Reflection;
using System.Text;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.Extensions.Logging;
@ -57,16 +59,17 @@ namespace Volo.Abp.AspNetCore.Mvc
var method = apiDescription.ActionDescriptor.GetMethodInfo();
if (controllerModel.Actions.ContainsKey(method.Name))
var uniqueMethodName = GetUniqueActionName(method);
if (controllerModel.Actions.ContainsKey(uniqueMethodName))
{
Logger.LogWarning($"Controller '{controllerModel.Name}' contains more than one action with name '{method.Name}' for module '{moduleModel.Name}'. Ignored: " + apiDescription.ActionDescriptor.GetMethodInfo());
Logger.LogWarning($"Controller '{controllerModel.Name}' contains more than one action with name '{uniqueMethodName}' for module '{moduleModel.Name}'. Ignored: " + method);
return;
}
var returnValue = new ReturnValueApiDescriptionModel(method.ReturnType);
var actionModel = controllerModel.AddAction(new ActionApiDescriptionModel(
method.Name,
uniqueMethodName,
returnValue,
apiDescription.RelativePath,
apiDescription.HttpMethod
@ -81,6 +84,29 @@ namespace Volo.Abp.AspNetCore.Mvc
?? apiDescription.ActionDescriptor.AsControllerActionDescriptor().ControllerName;
}
private static string GetUniqueActionName(MethodInfo method)
{
var methodNameBuilder = new StringBuilder(method.Name);
var parameters = method.GetParameters();
if (parameters.Any())
{
methodNameBuilder.Append("By");
for (var i = 0; i < parameters.Length; i++)
{
if (i > 0)
{
methodNameBuilder.Append("And");
}
methodNameBuilder.Append(parameters[i].Name.ToPascalCase());
}
}
return methodNameBuilder.ToString();
}
private void AddParameterDescriptionsToModel(ActionApiDescriptionModel actionModel, MethodInfo method, ApiDescription apiDescription)
{
if (!apiDescription.ParameterDescriptions.Any())
@ -143,6 +169,12 @@ namespace Volo.Abp.AspNetCore.Mvc
}
}
var areaAttr = controllerType.GetCustomAttributes().OfType<AreaAttribute>().FirstOrDefault();
if (areaAttr != null)
{
return areaAttr.RouteValue;
}
return AbpControllerAssemblySetting.DefaultServiceModuleName;
}
}

@ -3,6 +3,7 @@ using Volo.Abp.Http.Modeling;
namespace Volo.Abp.AspNetCore.Mvc.Controllers
{
[Area("abp")]
public class ApiDefinitionController : AbpController
{
private readonly IApiDescriptionModelProvider _modelProvider;
@ -16,8 +17,6 @@ namespace Volo.Abp.AspNetCore.Mvc.Controllers
[Route("api/abp/api-description")]
public ApplicationApiDescriptionModel Get()
{
//TODO: It can not create methods if there are overloads of same action in a controller!
return _modelProvider.CreateModel();
}
}

Loading…
Cancel
Save