为何注释AddApplicationPart后,ASP.NET类库控制器仍可正常工作?
问题解答
你忽略了ASP.NET Core框架默认的控制器发现逻辑——当你调用builder.Services.AddControllers()(或AddMvc、AddRazorPages等相关服务注册方法)时,框架会自动完成以下操作:
- 将当前启动项目的程序集添加为应用部件
- 自动扫描所有被当前项目直接/间接引用的程序集,只要程序集中包含继承自
ControllerBase或Controller的类型,就会被自动纳入应用部件体系,控制器就能被路由系统发现并处理请求
所以你注释掉AddApplicationPart后,类库中的控制器依然可用,是因为框架已经通过默认扫描把这个类库程序集包含进去了。
类库控制器需要刻意“不暴露”的场景
当你引用了某个包含控制器的类库,但不想让其中的控制器被当前应用的路由系统识别时,就需要主动干预,常见的实现方式有:
- 在类库的控制器上标记
[NonController]属性,让框架跳过对它的控制器识别 - 自定义
ControllerFeatureProvider,在IsController方法中排除特定命名空间/类型的控制器 - 手动控制应用部件的添加:不依赖默认扫描,只显式添加你需要的程序集(比如只添加当前项目程序集,不添加类库程序集)
举个自定义FeatureProvider的例子:
public class ExcludeLibraryControllersProvider : ControllerFeatureProvider { protected override bool IsController(TypeInfo typeInfo) { // 排除My.Class.Library命名空间下的所有控制器 return base.IsController(typeInfo) && !typeInfo.Namespace.StartsWith("My.Class.Library"); } } // 在Program.cs中注册 builder.Services.AddControllers() .ConfigureApplicationPartManager(apm => { // 移除默认的ControllerFeatureProvider apm.FeatureProviders.Remove(apm.FeatureProviders.OfType<ControllerFeatureProvider>().First()); // 添加自定义的Provider apm.FeatureProviders.Add(new ExcludeLibraryControllersProvider()); });
内容的提问来源于stack exchange,提问作者g.pickardou
相关产品推荐
相关产品推荐

