使用 Razor 作为面向对象的代码生成器有什么问题吗?

问题描述 投票:0回答:1

我一直在尝试使用 T4 模板为具有方法和属性的类生成代码。虽然它符合我的目的,但它缺少一些非常理想的生产力功能,例如 Macintosh 上的语法突出显示、片段和模板。趋势似乎正在远离 T4。我在使用其他模板标记引擎(例如 Scriban 和 Liquid)时遇到了同样的问题,

Razor 模板似乎是一种替代方案,但它似乎更适合生成 HTML 标记代码。还不清楚它的语法是否与目标代码输出区域冲突,以及将代码作为单独的文件输出是否简单。 Razor 能否生成面向对象的代码并在 Web 应用程序的上下文之外运行?

razor code-generation razorengine dotliquid scriban
1个回答
0
投票

简短的回答是肯定的,但我确实这样做了,我不确定我会推荐用 Razor 这样做。我使用 RazorEngine 为一组数据库表生成骨架模型和 UI CrUD 表单。我将表模式拉入内部对象模型,对其进行了一些操作,并将其用作模板的输入模型。这是我用于创建 C# 类的 Razor 模板的简化示例:

public partial class @(Model.ObjectName)
{
    public @(Model.ObjectName) () 
    {
    }

    @foreach (UIGen.UITableCol Col in Model.Columns)
    {

        if (!Col.IsNullable)
        {
            <text>[System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings=false)]</text>
        }
        if (Col.CSharpType == "string" && Col.MaxLength > 0)
        {
            <text>[StringLength(@Col.MaxLength)]</text>
        }
        @(Col.MVCPropertyAttributes)
        <text>[DisplayName("@(UIGen.Helpers.ToCSharpStringLiteral(Col.ColLabel))")]
            [Column]
            public @Col.CSharpType @Col.ColName { get; set; }
        </text>
    }
}

它对我有用,但我不会全心全意推荐它的原因是:

  • 智能感知有时有效,但经常失去情节。我也认为这将是使用 Razor 的主要优势。但是,我是通过控制台应用程序执行此操作,而不是在其自然的 MVC 环境中使用 Razor,所以 YMMV。
  • 你最终会在同一个文件中混淆模板 C# 和输出 C#。对于任何超出简单输出的内容,您都会开始对花括号视而不见。 (我还生成了很多服务器端控制器和验证代码。)
  • 如果你使模板格式整齐,你得到的 C# 不是(很多空格等)。生成 C# 后,我将其推送到 dotnet-format 以整理它。
© www.soinside.com 2019 - 2024. All rights reserved.