Blazor WASM ASP.NET Core托管模式下能否配置多个独立Server项目?
结论
完全可行,这是垂直切片架构在ASP.NET Core托管Blazor WASM场景下非常成熟的落地方案。
实现方式
你不需要将多个业务服务项目都设为启动项,仅需设置一个统一的宿主项目作为入口即可:
- 项目类型调整:将
Project.Server.Users、Project.Server.Orders、Project.Server.Customers这类业务域服务项目设置为类库项目,而非Web项目,仅保留一个单独的Project.Server.Host作为Web类型的启动宿主项目。 - 控制器自动发现配置:ASP.NET Core默认只会扫描当前入口程序集的控制器,要让宿主项目识别其他引用程序集中的控制器,需要在宿主项目的
Program.cs中显式注册业务程序集:
// 注册所有业务服务项目的程序集,让ASP.NET Core能扫描到对应的控制器 builder.Services.AddControllers() .AddApplicationPart(typeof(Project.Server.Users.SomeUsersType).Assembly) .AddApplicationPart(typeof(Project.Server.Orders.SomeOrdersType).Assembly) .AddApplicationPart(typeof(Project.Server.Customers.SomeCustomersType).Assembly);
配置完成后,所有业务项目中的控制器路由规则和单Server项目的规则完全一致,Blazor Client端调用接口无需做任何额外适配。
推荐的最终项目结构
Project.Client:Blazor WASM前端项目,和默认模板的作用一致Project.Shared:前后端共用的DTO、枚举、常量等公共定义Project.Server.Shared:所有服务端共用的基础设施,包括鉴权逻辑、全局过滤器、通用工具类、数据库配置基类等Project.Server.Users/Project.Server.Orders/Project.Server.Customers:各业务域独立服务项目,仅包含对应业务的控制器、领域逻辑、数据访问、实体配置等内容Project.Server.Host:统一启动宿主项目,仅包含Program.cs、配置文件、静态文件托管逻辑,不包含任何业务代码,仅引用所有业务服务项目和Project.Server.Shared
注意事项
- 避免业务服务项目之间直接互相引用,跨域业务调用建议通过公共事件、共享基础设施层或者接口依赖实现,避免破坏垂直切片的隔离性
- 不同业务域的控制器建议加上业务前缀路由,比如用户模块控制器统一加
[Route("api/users/[action]")],避免出现路由冲突 - 如果使用EF Core,可以将各业务域的DbContext拆分到对应业务服务项目中,在宿主项目统一注册即可
内容的提问来源于stack exchange,提问作者briddums
相关产品推荐
相关产品推荐

