Skip to content

Commit

Permalink
Introduce AspNetCoreApiDescriptionModelProviderOptions.
Browse files Browse the repository at this point in the history
Resolve #5921
  • Loading branch information
maliming committed Jan 27, 2021
1 parent fdd6b42 commit 8d88fe9
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 44 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,17 +25,20 @@ public class AspNetCoreApiDescriptionModelProvider : IApiDescriptionModelProvide
{
public ILogger<AspNetCoreApiDescriptionModelProvider> Logger { get; set; }

private readonly AspNetCoreApiDescriptionModelProviderOptions _options;
private readonly IApiDescriptionGroupCollectionProvider _descriptionProvider;
private readonly AbpAspNetCoreMvcOptions _options;
private readonly AbpAspNetCoreMvcOptions _abpAspNetCoreMvcOptions;
private readonly AbpApiDescriptionModelOptions _modelOptions;

public AspNetCoreApiDescriptionModelProvider(
IOptions<AspNetCoreApiDescriptionModelProviderOptions> options,
IApiDescriptionGroupCollectionProvider descriptionProvider,
IOptions<AbpAspNetCoreMvcOptions> options,
IOptions<AbpAspNetCoreMvcOptions> abpAspNetCoreMvcOptions,
IOptions<AbpApiDescriptionModelOptions> modelOptions)
{
_descriptionProvider = descriptionProvider;
_options = options.Value;
_descriptionProvider = descriptionProvider;
_abpAspNetCoreMvcOptions = abpAspNetCoreMvcOptions.Value;
_modelOptions = modelOptions.Value;

Logger = NullLogger<AspNetCoreApiDescriptionModelProvider>.Instance;
Expand Down Expand Up @@ -82,14 +85,14 @@ public ApplicationApiDescriptionModel CreateApiModel(ApplicationApiDescriptionMo

var controllerModel = moduleModel.GetOrAddController(
controllerType.FullName,
CalculateControllerName(controllerType, setting),
_options.ControllerNameGenerator(controllerType, setting),
controllerType,
_modelOptions.IgnoredInterfaces
);

var method = apiDescription.ActionDescriptor.GetMethodInfo();

var uniqueMethodName = GetUniqueActionName(method);
var uniqueMethodName = _options.ActionNameGenerator(method);
if (controllerModel.Actions.ContainsKey(uniqueMethodName))
{
Logger.LogWarning(
Expand Down Expand Up @@ -119,44 +122,6 @@ public ApplicationApiDescriptionModel CreateApiModel(ApplicationApiDescriptionMo
AddParameterDescriptionsToModel(actionModel, method, apiDescription);
}

private static string CalculateControllerName(Type controllerType, ConventionalControllerSetting setting)
{
var controllerName = controllerType.Name.RemovePostFix("Controller")
.RemovePostFix(ApplicationService.CommonPostfixes);

if (setting?.UrlControllerNameNormalizer != null)
{
controllerName =
setting.UrlControllerNameNormalizer(
new UrlControllerNameNormalizerContext(setting.RootPath, controllerName));
}

return 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 static List<string> GetSupportedVersions(Type controllerType, MethodInfo method,
ConventionalControllerSetting setting)
{
Expand Down Expand Up @@ -377,7 +342,7 @@ private string GetRemoteServiceName(Type controllerType, [CanBeNull] Conventiona
[CanBeNull]
private ConventionalControllerSetting FindSetting(Type controllerType)
{
foreach (var controllerSetting in _options.ConventionalControllers.ConventionalControllerSettings)
foreach (var controllerSetting in _abpAspNetCoreMvcOptions.ConventionalControllers.ConventionalControllerSettings)
{
if (controllerSetting.ControllerTypes.Contains(controllerType))
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
using System;
using System.Linq;
using System.Reflection;
using System.Text;
using Volo.Abp.Application.Services;
using Volo.Abp.AspNetCore.Mvc.Conventions;

namespace Volo.Abp.AspNetCore.Mvc
{
public class AspNetCoreApiDescriptionModelProviderOptions
{
public Func<Type, ConventionalControllerSetting, string> ControllerNameGenerator { get; set; }

public Func<MethodInfo, string> ActionNameGenerator { get; set; }

public AspNetCoreApiDescriptionModelProviderOptions()
{
ControllerNameGenerator = (controllerType, setting) =>
{
var controllerName = controllerType.Name.RemovePostFix("Controller")
.RemovePostFix(ApplicationService.CommonPostfixes);
if (setting?.UrlControllerNameNormalizer != null)
{
controllerName =
setting.UrlControllerNameNormalizer(
new UrlControllerNameNormalizerContext(setting.RootPath, controllerName));
}
return controllerName;
};

ActionNameGenerator = (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();
};
}
}
}

0 comments on commit 8d88fe9

Please sign in to comment.