Browse Source

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

pull/96/head
Halil İbrahim Kalkan 9 years ago
parent
commit
bc68b01bc5
  1. 38
      src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs
  2. 3
      src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Controllers/ApiDefinitionController.cs

38
src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs

@ -1,6 +1,8 @@
using System; using System;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using System.Text;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ApiExplorer; using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
@ -57,16 +59,17 @@ namespace Volo.Abp.AspNetCore.Mvc
var method = apiDescription.ActionDescriptor.GetMethodInfo(); 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; return;
} }
var returnValue = new ReturnValueApiDescriptionModel(method.ReturnType); var returnValue = new ReturnValueApiDescriptionModel(method.ReturnType);
var actionModel = controllerModel.AddAction(new ActionApiDescriptionModel( var actionModel = controllerModel.AddAction(new ActionApiDescriptionModel(
method.Name, uniqueMethodName,
returnValue, returnValue,
apiDescription.RelativePath, apiDescription.RelativePath,
apiDescription.HttpMethod apiDescription.HttpMethod
@ -81,6 +84,29 @@ namespace Volo.Abp.AspNetCore.Mvc
?? apiDescription.ActionDescriptor.AsControllerActionDescriptor().ControllerName; ?? 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) private void AddParameterDescriptionsToModel(ActionApiDescriptionModel actionModel, MethodInfo method, ApiDescription apiDescription)
{ {
if (!apiDescription.ParameterDescriptions.Any()) 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; return AbpControllerAssemblySetting.DefaultServiceModuleName;
} }
} }

3
src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Controllers/ApiDefinitionController.cs

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

Loading…
Cancel
Save