如何实现Razor类库的Opt-in(可选加入)显式注册机制
Razor类库Opt-in显式注册实现方案
默认场景下,客户端项目添加Razor类库的项目引用后,框架会自动扫描加载类库内的页面、视图、静态资源等所有内容,不需要额外编写注册代码。Razor类库没有内置直接切换为Opt-in模式的配置开关,但完全可以手动实现和普通.NET类库一致的「仅添加引用不生效,必须显式注册才可使用」的逻辑,核心思路是先阻断框架默认的自动扫描加载规则,再通过自定义扩展方法手动完成注册。
具体实现步骤
阻断Razor类库的默认自动加载
修改客户端项目中对Razor类库的项目引用配置,在<ProjectReference>节点添加排除规则,告诉SDK不要将该类库纳入启动时的自动应用部件扫描范围:<ProjectReference Include="..\YourRclProjectPath\Your.Rcl.csproj"> <!-- 仅排除运行时自动加载相关资产,保留编译期公共类型引用 --> <ExcludeAssets>runtime</ExcludeAssets> </ProjectReference>配置完成后,就算项目持有Razor类库的引用,应用启动时也不会自动加载其中的Razor相关功能,和引用普通工具类.NET库的表现完全一致。
编写显式注册扩展方法
在Razor类库中编写和常规类库一致的注册扩展方法,手动完成原来框架自动执行的加载逻辑:using Microsoft.AspNetCore.Mvc.ApplicationParts; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.FileProviders; public static class RclServiceExtensions { /// <summary> /// 显式注册Razor类库的MVC相关功能(页面、控制器、视图组件等) /// </summary> public static IMvcBuilder AddCustomRcl(this IMvcBuilder mvcBuilder) { var rclAssembly = typeof(RclAssemblyMarker).Assembly; // 手动将RCL程序集加入MVC应用部件列表 mvcBuilder.AddApplicationPart(rclAssembly); // 如果需要支持RCL视图运行时编译,可添加以下配置 mvcBuilder.AddRazorRuntimeCompilation(options => { options.AdditionalReferencePaths.Add(rclAssembly.Location); }); return mvcBuilder; } /// <summary> /// 显式启用Razor类库内的静态资源访问 /// </summary> public static IApplicationBuilder UseCustomRcl(this IApplicationBuilder app) { app.UseStaticFiles(new StaticFileOptions { FileProvider = new EmbeddedFileProvider( typeof(RclAssemblyMarker).Assembly, "Your.Rcl.DefaultNamespace.wwwroot" ), RequestPath = "/custom-rcl-assets" }); return app; } // RCL程序集标记类,用于获取当前程序集引用 private class RclAssemblyMarker { } }客户端项目显式调用注册
完成上述配置后,客户端必须在启动代码中显式调用对应扩展方法,才能使用Razor类库的功能:var builder = WebApplication.CreateBuilder(args); // 必须显式调用Add方法,才会加载RCL的页面、控制器等功能 builder.Services.AddControllersWithViews() .AddCustomRcl(); var app = builder.Build(); // 需要使用RCL静态资源时,显式调用Use方法 app.UseCustomRcl(); // 其余中间件配置... app.Run();
注意事项
如果你的Razor类库没有静态资源、只包含类库逻辑,不需要编写UseCustomRcl方法,仅保留服务注册的扩展方法即可。如果需要更细粒度的控制加载规则,也可以在客户端启动时直接修改ApplicationPartManager的配置,过滤掉不需要自动加载的程序集。
内容的提问来源于stack exchange,提问作者lonix
相关产品推荐
相关产品推荐

