如何引用含控制器的项目且仅启用当前程序集路由?
解决方案:限制路由仅扫描当前程序集的控制器
嘿,我明白你的痛点了——你想把新控制器当遗留控制器的包装用,但引用新服务项目后,它的所有路由都跑出来了,只想让当前程序集的路由生效对吧?这事儿好办,核心就是限制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
相关产品推荐
相关产品推荐

