目录
在这篇文章中,您将了解BootGen的内部工作原理,BootGen是一种代码生成器,可以基于JSON数据集创建 ASP.NET 5和Vue 3应用程序。
介绍
{
"users": [
{
"userName": "Jon",
"email": "jon@arbuckle.com",
"pets": [
{
"name": "Garfield",
"species": "cat"
},
{
"name": "Odie",
"species": "dog"
}
]
}
]
}
想象一下,您开始为宠物主人编写Web应用程序。上面的一段JSON代码是您的初始数据集。你如何开始?在您可以开始实现您为该项目设想的热门功能之前,需要先完成一些基础工作。
对于数据库,您将需要两个表,users以及pets。 您将需要一个种子,用初始dataset填充数据库。 对于后端,您将需要user和pet类的数据服务和控制器。对于前端,您将需要一个REST API客户端和状态管理。一些基本的查看器和编辑器也一定会派上用场。哦,不要忘记身份验证!
现在您已经完成了所有这些,您可以开始处理有意义的部分。但是这个“基础工作”需要做多少工作?好吧,如果您选择的堆栈是带有Vue 3和TypeScript的ASP.NET 5,那么它将是26个文件中的1677行代码。此代码量不包括使用dotnet new和vue create命令创建的空项目。
BootGen项目的目标是获取JSON dataset并为您的项目生成基础,从而为您节省数小时甚至数天的工作。
您已经可以在bootgen.com 上尝试了!
它是如何工作的?
本文的重点是讨论BootGen在底层是如何工作的。如果您只想使用该工具并享受空闲时间,则没有必要了解这一点。
创建数据模型
生成过程中有两个重要步骤。首先,应基于数据集构建数据模型。以下类可用于创建数据模型。
public class ClassModel
{
public int Id { get; set; }
public string Name { get; set; }
public List<Property> Properties { get; }
}
public class Property
{
public string Name { get; set; }
public BuiltInType BuiltInType { get; set; }
public bool IsCollection { get; set; }
public ClassModel Class { get; set; }
}
public enum BuiltInType { String, Int, Float, Bool, DateTime, Object }
这些是从我们在SDK中实际使用的内容简化而来的。如果您对完整的元模型感兴趣,可以在GitHub - BootGen/BootGenSDK: Customizable code generator library for rapid application prototyping.找到它。
如果我们假设集合名称始终采用复数形式,而其他所有内容始终采用单数形式,则可以从JSON属性名称中轻松推断出类的名称。Pluralize.NET使我们能够方便地找到特定单词的复数或单数形式。
对于每个JSON属性,我们将在我们的模型中创建一个属性。如果它有一个原始类型(string, integer, float, boolean, 或date-time),那么我们一步完成。但是,如果它是object,那么我们继续递归:我们将检查是否已经存在同名的类模型。如果是,我们将扩展它,如果不是,那么我们创建一个新的。
呈现代码
为了呈现代码,我们使用了一种称为Scriban的模板语言。生成C#实体类的最简单模板如下所示:
public class {{ class.name }}
{
{{~ for property in class.properties ~}}
public {{ get_type property }} {{ property.name }} { get; set; }
{{~ end ~}}
}
class 变量是指ClassModel类型的对象。在Scriban中,每个属性和函数名称都转换为snake大小写。get_type是一个用C#实现的函数调用,如下所示:
public static string GetType(Property property)
{
string baseType = GetBaseType(property);
if (property.IsCollection)
return $"List<{baseType}>";
return baseType;
}
public static string GetBaseType(Property property)
{
switch (property.BuiltInType)
{
case BuiltInType.Bool:
return "bool";
case BuiltInType.Float:
return "float";
case BuiltInType.String:
return "string";
case BuiltInType.DateTime:
return "DateTime";
case BuiltInType.Object:
return property.Class.Name;
default:
return "int";
}
}
生成TypeScript代码时,使用了不同的GetType函数。
项目结构
BootGen SDK
这是处理从JSON输入构建数据模型并呈现Scriban模板的核心库。
框架插件
对不同框架的支持是作为插件实现的。目前,实现了以下插件:
一个框架插件包含:
- 一堆Scriban模板
- 一些静态文件(基本上是给定框架的空项目)
- 一个配置文件
我们尽最大努力保持插件界面干净,以便在未来轻松实现对其他框架的支持。
Web应用程序
这是部署到bootgen.com的Web应用程序。一种使用BootGen的便捷方式。
https://www.codeproject.com/Tips/5309774/Generating-Web-Application-Code-from-JSON-Sample-D