您的位置  > 互联网

为什么计算机无法自动为我们生成这些代码呢?

因此,很明显,我们应该能够利用这些共性从给定的数据库自动构建系统。 为什么我们需要自己写代码呢? 为什么计算机不能自动为我们生成这些代码?

魔法

我创建的 Magic 能够从数据库模式中读取元信息,并使用此信息为 HTTP REST 端点创建脚手架代码,并为数据库中的每个 CRUD 操作提供包装器。 我们的目的是在控制器端点和数据库之间创建一个薄薄的“”层,以便您只需单击按钮即可在数据库上创建和公开所有 CRUD 操作。

它是一种动态编程语言,也是一种不需要编译的 DSL,但它可以快速处理这些类型的操作,因为每个关键字只不过是 C# 中类的包装器。

因此,我们很容易创建“关键字”来对客户端进行身份验证和授权、将记录插入数据库、读取记录等,所有这些都只需几行代码。 它的语法很容易理解,也很容易让计算机理解,因此用户可以通过排列关键字来创建代码的脚手架。

演示流程:

在此视频中,Magic 首先读取数据库中每个表的数据库架构。 然后,创建四个文件,每个文件对应一个 CRUD 操作。 这些文件的路径取决于数据库对象的名称,因此假设数据库名为“foo”,表名为“bar”,则 HTTP GET 的路径为“/files/magic/foo/bar.txt”。 get.hl”指向包含该文件的磁盘的物理路径。

接下来,我通过动态路由控制器接受“/magic”下的“任何”URL。 该路由负责解析我的文件,并根据给定的 URL 执行适当的 HTTP 动词。

好吧,现在我可以在运行时自动创建包装现有数据库的代码,而不会中断应用程序的正常使用。 此外,我通过路由机制动态地将 HTTP 请求路由到服务器中的文件和文件夹(我之前创建的文件)。

对于小规模的简单应用来说,整个后端的Web API就只有这么多。 下一步是立即开始创建或响应前端。 复杂的应用程序可能需要上面未提供的其他功能,但至少您有后端的基本原型,然后您可以根据需要编写 C# 代码和 .Net 控制器。

Magic 基本上是“针对.Net Core 和C#”。 即使您的应用程序根本不需要 CRUD,如果您使用 MySQL 或 SQL,它仍然可以作为优秀的数据库管理系统来帮助您管理生产和开发环境中的数据库。 从这个角度来说,就相当于“for .Net Core”。

功能介绍

Magic 自动处理身份验证和授权。 例如,可以为每个 HTTP 端点分配一个“角色”列表(以逗号分隔),客户端必须对其进行身份验证才能执行端点的代码。 此实现采用 JWT 令牌,该令牌在调用“身份验证”HTTP 端点时生成并返回给客户端。

由于Magic本身是兼容所有数据库的,所以这些方面还是需要一些手动操作。 但这实际上只是一个复制/粘贴工作,如果您愿意,您可以在生产中完成。 顺便说一句,有人可能对密码存储感兴趣,我在这里解释一下:密码是使用散列(“慢散列”)存储的,并且还支持独立的加盐算法。

您还可以通过 Magic 通知脚手架代码生成过程,并要求将每个端点上的 HTTP 请求写入日志。 默认情况下,Magic 使用它,但您可以创建自己的日志记录接口并替换它,然后通过依赖项注入将其提供给 Magic。 事实上,Magic 中的所有内容都基于 IoC 和依赖注入。

此外,您还可以声明您希望它支持的 CRUD 操作。 例如,某些数据库表可能是“只读”的,在这种情况下您根本不需要删除或更新端点。 在生成脚手架代码的过程中只需要修改一个简单的复选框即可。

魔法速度超级快。 首先,每个文件的大小都很小——只有大约 10-20 行代码。 因此,与针对某些数据库执行和处理 SQL 命令的昂贵过程相比,解析和评估文件几乎没有成本。

因此,这个“微小的层”几乎没有额外的成本。 此外,评测流程也被优化到了极致。 它本质上是 100%“异步”,这意味着它在评估文件时也使用 C# 和 CLR 的异步功能。 因此,它可以带来巨大的“吞吐量”并提供可扩展性功能,以轻松应用于任何“纯”C#或.NET应用程序。 如果你问我怎么想,那么我会告诉你,你不需要写一行代码。 还不够伟大吗?

通过您自己的关键字进行扩展就像创建一个简单的 C# 类一样简单。 这是一个真实的示例,其中我使用关键字 [.-with] 之一,如果字符串以其他字符串开头,则返回 true。

namespace magic.lambda.strings
{
[Slot(Name = "strings.starts-with")]
public class StartsWith : ISlot
{
public void Signal(ISignaler signaler, Node input)
{
// Sanity checking.
if (input.Children.Count != 1)
throw new ApplicationException("[strings.starts-with] must be given exactly one argument that contains value to look for");
signaler.Signal("eval", input);
input.Value = input.GetEx
.StartsWith(input.Children.First.GetEx, StringComparison.InvariantCulture);
}
}
}

创建您自己的关键字就像向您的类添加属性和接口一样简单,而且您还拥有一个新的“关键字”。 此功能为编程语言提供了一些极端的“DSL 功能”。 结果更方便人类阅读和理解。

但是,您无需了解任何内容即可使用 Magic,因为您的计算机了解如何创建和维护它。 因此,与Magic的关系相当于CLR代码与C#的关系。

以下示例演示了 HTTP 端点。 请注意,由于我自己创建了它,因此无法在 DZone 甚至代码中突出显示它,据我所知,全球用户不足 5 个。

但是,我有一个基于 Magic 的编辑器,它是 Magic 的组成部分,它可以在代码中突出显示语法,并且还可以自动完成。

/*
* Declaration of arguments the endpoint can accept.
*/
.arguments
limit:long
offset:long
order:string
direction:string
id:long
name:string

/*
* Appending arguments in [slots.signal] below.
*/
add:x:./*/slots.signal/*/args
get-nodes:x:@.arguments/*

/*
* Invoking [slots.signal] with "magic.db.mysql.read".
*/
slots.signal:magic.db.mysql.read
database:magic_auth
table:roles
args
columns
id
name

/*
* Returning the results to caller.
* This will transform the result to JSON,
* and return to the client as the HTTP response.
*/
slots.return-nodes:x:@slots.signal/*

注意:Magic 是一个全新的项目,可能包含一些错误。 它尚未在 上获得一百万颗星,而且据我所知,目前还没有纳斯达克上市公司在使用它。 所以如果你想评价的话,请耐心等待。 我将全力以赴提高代码质量并修复发现的任何错误。 以后我会继续维护该项目,但有时可能会出现一些测试版本中的常见问题。

您可以通过我的存储库 (.com//magic) 报告错误或请求功能。 即使您没有要报告的错误,我也会感谢您对该项目的建议或鼓励。

总结

总的来说,Magic 可以让你的工作量减少一半,让电脑来做无聊的工作,而你可以专注于有趣的工作。 这不是我们发明计算机的原因吗? 希望你能找到魔法带来的快乐。

关于Magic的详细信息如下:

原文:.com//-a-net-core-web-api-in-40-