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

如何实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 05:09:20