ASP.NET Core 6 Web项目如何实现Feature Folder结构并解决兼容报错
ASP.NET Core 6 实现Feature Folder结构解决方案
报错根因
你遇到的类型加载错误是因为**Microsoft.AspNetCore.Mvc.Razor 2.2.0 为.NET Core 2.x专属版本**,ASP.NET Core 3.0及之后所有MVC/Razor相关组件都已经整合到框架共享框架中,无需单独引用对应NuGet包。旧版本包依赖的Microsoft.AspNetCore.Mvc.Internal.MvcRouteHandler类型在后续版本中已经被重构移除,直接引用旧包会出现类型加载冲突。
具体解决步骤
步骤1:清理WebCommon项目依赖
- 移除WebCommon项目中引用的
Microsoft.AspNetCore.Mvc.Razor2.2.0 NuGet包 - 修改WebCommon项目的
.csproj文件,添加ASP.NET Core共享框架引用,替换原先单独引用的MVC相关NuGet包:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net6.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> <!-- 添加以下框架引用 --> <ItemGroup> <FrameworkReference Include="Microsoft.AspNetCore.App" /> </ItemGroup> <!-- 其他项目配置 --> </Project>
步骤2:在WebCommon中实现Feature Folder视图扩展
实现IViewLocationExpander接口自定义视图搜索路径,适配Feature Folder结构:
using Microsoft.AspNetCore.Mvc.Razor; public class FeatureViewLocationExpander : IViewLocationExpander { public void PopulateValues(ViewLocationExpanderContext context) { // 无特殊参数要求可留空 } public IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations) { // 按Feature Folder结构自定义视图搜索路径,可按需调整 var featureViewLocations = new[] { // 路径规则:Features/[Feature名]/[Controller名]/[视图名].cshtml "Features/{1}/{0}.cshtml", // 路径规则:Features/[Feature名]/[视图名].cshtml "Features/{0}.cshtml", // 路径规则:Features/Shared/[公共视图名].cshtml "Features/Shared/{0}.cshtml" }; // 合并原有视图路径做兼容 return featureViewLocations.Concat(viewLocations); } }
步骤3:封装服务注册扩展方法
在WebCommon中封装配置扩展,方便WebPublic项目调用:
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Razor; public static class FeatureFolderServiceExtensions { public static IMvcBuilder AddFeatureFolderSupport(this IMvcBuilder builder) { // 注册自定义视图位置扩展器 builder.ConfigureRazorViewEngine(options => { options.ViewLocationExpanders.Add(new FeatureViewLocationExpander()); }); // 如果WebCommon中包含Feature相关控制器/视图,需要注册当前程序集 builder.AddApplicationPart(typeof(FeatureViewLocationExpander).Assembly); return builder; } }
步骤4:在WebPublic项目中启用配置
修改WebPublic项目的Program.cs文件,启用Feature Folder支持:
var builder = WebApplication.CreateBuilder(args); // 注册MVC服务时启用Feature Folder结构 builder.Services.AddControllersWithViews() .AddFeatureFolderSupport(); // 其他服务注册逻辑保持不变 var app = builder.Build(); // 中间件配置保持不变,可按需添加Feature专属路由规则 app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); // 可选:添加Feature维度的路由规则 app.MapControllerRoute( name: "featureRoute", pattern: "{feature}/{controller=Home}/{action=Index}/{id?}"); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run();
注意事项
- 如果WebCommon中包含嵌入式Razor视图,需要在WebCommon的
.csproj中配置视图为嵌入资源:<ItemGroup> <EmbeddedResource Include="Features/**/*.cshtml" /> </ItemGroup> - 不要在.NET 6及以上版本的项目中单独引用2.x版本的
Microsoft.AspNetCore.*系列NuGet包,所有相关API都已包含在共享框架中。
内容的提问来源于stack exchange,提问作者Zbigniew Krumins
相关产品推荐
相关产品推荐

