You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何注释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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 07:22:13