Roslyn:从控制器路由自动生成方法

Roslyn: Auto generating methods from controller routes

提问人:Taylor C. White 提问时间:4/13/2023 更新时间:5/18/2023 访问量:62

问:

我编写了一个 Roslyn 源代码生成器,该生成器访问所有控制器的方法,这些方法上具有 HttpGet、HttpPut、HttpDelete 或 HttpPost 属性,然后创建如下类,我希望这些类可用于我的 Blazor 客户端类:

// <auto-generated>
//     This code was generated by OurGov.Data.Shared.Generators.ApiRoutesGenerator version 1.0.4.1
// </auto-generated>


#nullable enable

namespace OurGov.Data.Shared.Models.Routes;

/// <summary>Defines routes.</summary>
public static partial class ApiRoutes
{
    /// <summary>Endpoints for EventsController</summary>
    public static class EventsRoutes
    {
        /// <summary>HttpGet: See EventsController.GetEventsForFeed</summary>
        public static string GetEventsForFeed(string filterValue) => $"api/events/feed/{filterValue}";


        ...more endpoints...
        
        /// <summary>HttpPost: See EventsController.GetHearingsForCommittee</summary>
        public static string GetHearingsForCommittee() => $"api/events/hearings/search";
    }
}

我将命名空间设置为与 OurGov.Data.Shared .DLL的一部分相同的命名空间,但是,唉,(回想起来,显然)这并不能使它如此。

我将如何从我的启动项目(即我的控制器所在的位置)生成代码,然后让这些新生成的类自动(理想情况下)可供下游项目(服务器所依赖的项目)使用?

下面是描述体系结构的图像:Architecture of project dependencies.

代码生成 Roslyn 源生成器 csharp-source-generator

评论


答:

1赞 Kevin Krumwiede 5/18/2023 #1

禁止增量源生成器访问其目标项目之外的文件。他们也无法进行网络调用,也无法轻松使用 NuGet 包。所有这些事情都可以用老式的控制台应用源生成器来完成。我已经有一段时间没有使用过其中之一了,也不知道它们在最新版本的 .NET 和 Visual Studio 中的工作情况如何。

我无法向你指出有关如何编写控制台应用源代码生成器的明确来源。如果你走这条路,你将不得不从旧的博客文章中拼凑出来。这是我几年前写的一个示例:NSwagClientGenerator