c# - 通用控制器未注册
问题描述
为我的所有通用控制器生成有效类型并在 ConfigureApplicationPartManager 的选项中调用 PopulateFeature 方法,但是当我尝试实现 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));
}
}
解决方案
解决了
将逻辑直接添加到启动类是我的问题的原因。在应用程序启动生命周期的不同点,控制器功能的填充功能将被覆盖。我必须创建一个继承自 I 应用程序功能提供程序的类:
GenericControllerFeatureProvider : IApplicationFeatureProvider<ControllerFeature>
在启动类中注册它
services.AddMvc(c =>
c.Conventions.Add(new GenericControllerRouteConvention()
))
.ConfigureApplicationPartManager(apm =>
{
apm.FeatureProviders.Add(new GenericControllerFeatureProvider(GetDataProviders()));
});
推荐阅读
- php - 意外的循环结果
- asp.net-core - 找不到类型或命名空间 SigninManager<> 身份 3.1.1 Mediatr 8.0.0
- google-maps - 如何在仅包含地标文件夹的 KML/KMZ 文件中使用 NetworkLink refreshMode?
- python - 我无法在 anaconda python3.6 和 spyder 上成功运行 tensorflow-gpu
- ruby-on-rails - 如何在 PostgreSQL + Rails 上获得不同两列的计算值?
- reactjs - 如何根据父组件的更改重置组件的状态?
- asp.net - 使用 AngularJS 将数据从视图传递到 net-mvc 控制器
- javascript - Angular:ngOnInit 不加载我的函数?
- networking - 物理通信的通用“管道”概念的名称?
- php - Laravel 5.6 通知“没有发件人地址无法发送消息”