45 lines
1.3 KiB
C#
45 lines
1.3 KiB
C#
using Microsoft.AspNetCore.Mvc.ApplicationParts;
|
|
using Microsoft.AspNetCore.Mvc.Controllers;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
using zero.Core;
|
|
using zero.Web.Filters;
|
|
|
|
namespace zero.Web
|
|
{
|
|
public class ApiControllerFeatureProvider : IApplicationFeatureProvider<ControllerFeature>
|
|
{
|
|
public ApiControllerFeatureProvider()
|
|
{
|
|
|
|
}
|
|
|
|
|
|
public void PopulateFeature(IEnumerable<ApplicationPart> parts, ControllerFeature feature)
|
|
{
|
|
Assembly currentAssembly = typeof(ApiControllerFeatureProvider).Assembly;
|
|
|
|
IEnumerable<Type> candidates = currentAssembly.GetExportedTypes().Where(x => x.GetCustomAttributes<BackofficeGenericControllerAttribute>().Any() && x.ContainsGenericParameters);
|
|
|
|
foreach (Type candidate in candidates)
|
|
{
|
|
Type genericType = candidate.GetGenericTypeDefinition();
|
|
Type[] arguments = genericType.GetGenericArguments();
|
|
Type desiredInterface = arguments.FirstOrDefault()?.GetInterfaces().FirstOrDefault();
|
|
|
|
if (desiredInterface == null)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
Type implementation = EntityMap.Get(desiredInterface);
|
|
TypeInfo type = candidate.MakeGenericType(implementation).GetTypeInfo();
|
|
|
|
feature.Controllers.Add(type);
|
|
}
|
|
}
|
|
}
|
|
}
|