Сгенерировал допустимые типы для всех моих универсальных контроллеров и вызывает метод PopulateFeature в параметрах ConfigureApplicationPartManager, но когда я пытаюсь реализовать GenericControllerRouteConvention, контроллер отсутствует в списке зарегистрированных контроллеров.
var providerTypes = new List<Type>();
var refAssemblies = Assembly.GetExecutingAssembly().GetReferencedAssemblies().Select(Assembly.Load);
foreach (var assembly in refAssemblies)
{
var candidates = assembly.GetExportedTypes().Where( x =>
x.IsClass &&
!x.IsAbstract &&
x.BaseType.IsGenericType &&
x.BaseType.GetGenericTypeDefinition() == typeof(DataProvider<,>));
foreach (var candidate in candidates)
{
providerTypes.Add(candidate);
}
}
services.
AddMvc(c =>
c.Conventions.Add(
new GenericControllerRouteConvention()
)).
ConfigureApplicationPartManager(o =>
{
var contollerFeature = new ControllerFeature();
foreach (var providerType in providerTypes)
{
contollerFeature.Controllers.Add(
typeof(DataProviderContoller<,,>)
.MakeGenericType(
providerType,
providerType.BaseType.GetGenericArguments()[0],
providerType.BaseType.GetGenericArguments()[1])
.GetTypeInfo());
}
o.PopulateFeature(contollerFeature);
});
Универсальный контроллер
public class DataProviderContoller<TProvider, TModel, TKey> : Controller
where TProvider : DataProvider<TModel, TKey>
{
private readonly DataProvider<TModel, TKey> _dataProvider;
public DataProviderContoller(TProvider dataProvider)
{
_dataProvider = dataProvider ?? throw new ArgumentNullException(nameof(dataProvider));
}
}