C# 未注册通用控制器

C# 未注册通用控制器,c#,reflection,dependency-injection,.net-core,C#,Reflection,Dependency Injection,.net Core,为所有泛型控制器生成有效类型,并在ConfigureApplicationPartManager的选项中调用PopulateFeature方法,但当我尝试实现泛型控制器RouteContvention时,控制器不在已注册控制器的列表中 var providerTypes = new List<Type>(); var refAssemblies = Assembly.GetExecutingAssembly().GetReferencedAssemblie

为所有泛型控制器生成有效类型,并在ConfigureApplicationPartManager的选项中调用PopulateFeature方法,但当我尝试实现泛型控制器RouteContvention时,控制器不在已注册控制器的列表中

  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));
        }        

    }
解决

将逻辑直接添加到启动类是我的问题的原因。在应用程序启动生命周期的不同点,控制器的填充功能将被覆盖。我必须创建一个继承自I应用程序功能提供程序的类:

GenericControllerFeatureProvider : IApplicationFeatureProvider<ControllerFeature>
 services.AddMvc(c =>
                c.Conventions.Add(new GenericControllerRouteConvention()
            ))
            .ConfigureApplicationPartManager(apm =>
            {
                apm.FeatureProviders.Add(new GenericControllerFeatureProvider(GetDataProviders()));
            });