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

如何引用含控制器的项目且仅启用当前程序集路由?

解决方案:限制路由仅扫描当前程序集的控制器

嘿,我明白你的痛点了——你想把新控制器当遗留控制器的包装用,但引用新服务项目后,它的所有路由都跑出来了,只想让当前程序集的路由生效对吧?这事儿好办,核心就是限制ASP.NET Core扫描控制器的范围,只锁定你当前的项目程序集就行,给你两种靠谱的实现方式:

方法一:直接指定要加载的应用部件(简单快捷)

ASP.NET Core默认会扫描所有引用程序集里的控制器,我们可以手动移除默认的扫描范围,只添加当前程序集作为应用部件:

// 在Program.cs(或Startup.cs的ConfigureServices方法)中
builder.Services.AddControllers()
    // 先移除所有默认注册的应用部件
    .RemoveAllApplicationParts()
    // 只添加当前程序集的控制器
    .AddApplicationPart(System.Reflection.Assembly.GetExecutingAssembly());

这样配置后,路由系统只会识别当前项目里的控制器,引用的新服务项目中的控制器不会被注册,自然也就不会暴露路由了。

方法二:自定义控制器特性提供者(更灵活)

如果需要更精细的控制(比如未来可能要加其他特定程序集),可以自定义一个ControllerFeatureProvider,只允许当前程序集的类型被识别为控制器:

首先创建自定义提供者类:

using System.Reflection;
using Microsoft.AspNetCore.Mvc.Controllers;

public class CurrentAssemblyControllerFeatureProvider : ControllerFeatureProvider
{
    protected override bool IsController(TypeInfo typeInfo)
    {
        // 先判断是否符合默认的控制器规则
        var isBaseController = base.IsController(typeInfo);
        // 再额外限制必须是当前程序集的类型
        return isBaseController && typeInfo.Assembly == Assembly.GetExecutingAssembly();
    }
}

然后在服务注册时替换默认的提供者:

builder.Services.AddControllers()
    .ConfigureApplicationPartManager(apm =>
    {
        // 移除默认的控制器特性提供者
        var defaultProvider = apm.FeatureProviders.OfType<ControllerFeatureProvider>().FirstOrDefault();
        if (defaultProvider != null)
        {
            apm.FeatureProviders.Remove(defaultProvider);
        }
        // 添加我们自定义的提供者
        apm.FeatureProviders.Add(new CurrentAssemblyControllerFeatureProvider());
    });

这种方式可以根据你的需求扩展规则,比如后续要加入其他特定程序集的控制器,只需要修改IsController方法的判断逻辑就行。

补充说明

本质上,这两种方法都是通过控制控制器的发现范围来实现路由的限制——ASP.NET Core的路由系统只会为被成功发现并注册的控制器生成路由,所以只要把范围锁定在当前程序集,引用项目里的控制器就不会被纳入路由系统啦。

内容的提问来源于stack exchange,提问作者mft25

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:21:29