using System; using Microsoft.AspNetCore.Mvc.ApplicationModels; using Microsoft.Extensions.DependencyInjection; using OpenHarbor.CQRS.Abstractions.Discovery; namespace OpenHarbor.CQRS.DynamicQuery.AspNetCore.Mvc; public class DynamicQueryControllerConvention : IControllerModelConvention { private readonly IServiceProvider _serviceProvider; public DynamicQueryControllerConvention(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; } public void Apply(ControllerModel controller) { if (controller.ControllerType.IsGenericType && controller.ControllerType.Name.Contains("DynamicQueryController") && controller.ControllerType.Assembly == typeof(DynamicQueryControllerConvention).Assembly) { var genericType = controller.ControllerType.GenericTypeArguments[0]; var queryDiscovery = _serviceProvider.GetRequiredService(); var query = queryDiscovery.FindQuery(genericType); controller.ControllerName = query.LowerCamelCaseName; } } }