ASP.NET Core 6类库中如何实现继承自ControllerBase的控制器?
在ASP.NET Core 6类库中实现继承自ControllerBase的控制器
1. 配置类库项目的框架引用
ASP.NET Core 3.0+ 开始,Microsoft.AspNetCore.Mvc.Core等核心包不再作为独立NuGet包发布,而是包含在ASP.NET Core共享框架中。对于类库项目,只需在项目文件(.csproj)中添加对共享框架的引用,无需手动安装过时的NuGet包:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net6.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> <ItemGroup> <!-- 引入ASP.NET Core共享框架,包含ControllerBase等核心类型 --> <FrameworkReference Include="Microsoft.AspNetCore.App" /> </ItemGroup> </Project>
2. 实现继承自ControllerBase的控制器
在类库中正常编写控制器即可,和API项目中的控制器写法一致:
using Microsoft.AspNetCore.Mvc; namespace LibraryControllers; [ApiController] [Route("api/[controller]")] public class LibraryDemoController : ControllerBase { [HttpGet("test")] public IActionResult GetTestResponse() { return Ok("Response from class library controller"); } }
3. 在API项目中加载类库的控制器
默认情况下,ASP.NET Core 6只会扫描启动项目的程序集来发现控制器。要让API项目识别类库中的控制器,需要在Program.cs中配置控制器服务时,添加类库的程序集:
var builder = WebApplication.CreateBuilder(args); // 添加控制器服务,并指定要扫描的类库程序集 builder.Services.AddControllers() .AddApplicationPart(typeof(LibraryControllers.LibraryDemoController).Assembly); var app = builder.Build(); app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();
如果类库中有多个控制器,也可以通过类库中的任意类型获取程序集,无需逐个添加。
替代方案:使用控制器特性标记
如果不想手动添加程序集引用,可以在类库的控制器上保留[ApiController]特性(已在示例中使用),确保API项目在扫描时能识别到符合条件的控制器。另外,也可以在API项目中使用AddControllersAsServices()来注册所有控制器,但前提是已正确添加类库的程序集引用。
内容的提问来源于stack exchange,提问作者Aleksandr Sergeevich
相关产品推荐
相关产品推荐

