如何在 40 秒內創建一個.Net Core Web API?

為什麼我們需要自己寫代碼?為什麼計算機無法自動為我們生成這些代碼呢?很顯然,我們應該可以利用這些共同點,從一個給定的數據庫自動化構建系統——這就是“我”創建Magic的初衷。

如何在 40 秒内创建一个.Net Core Web API?

作者 | Thomas Hansen

出品 | CSDN(ID:CSDNnews)

作為一名C#開發人員,我坦白雖然我很喜歡C#,喜歡它的強類型、編譯器、泛型、LINQ等等,但有時我也會嫉妒PHP和Python開發人員。Python和PHP在本質上更為動態,而且還可以實現C#幾乎不可能完成的任務。大約在一年前,我的一位朋友向我展示了Django,我羞愧地承認.NET沒有類似的功能。因此,我決定通過自己的努力創造奇蹟,於是我創建了Magic。

如何在 40 秒内创建一个.Net Core Web API?

CRUD、HTTP和SQL

在軟件開發人員眼中,很多問題都可以歸結為將JSON從客戶端傳輸到後端。這個問題是如此普遍,所以我們總結出了一個縮寫CRUD:創建(Create)、讀取(Read)、更新(Update)和刪除(Delete)。HTTP請求的類型有post、put、delete和get。SQL擁有insert、update、delete和select。可以說,所有這些操作都基於相同的概念,即CRUD。

因此,很顯然我們應該可以利用這些共同點,從一個給定的數據庫自動化構建系統。為什麼我們需要自己寫代碼?為什麼計算機無法自動為我們生成這些代碼呢?

如何在 40 秒内创建一个.Net Core Web API?

Magic

我創建的Magic能夠從數據庫架構中讀取元信息,並利用這些信息來創建HTTP REST端點的腳手架代碼,並對數據庫中的每個CRUD操作提供封裝。我們的目的是在控制器端點和數據庫之間建立一層薄薄的“ Hyperlambda”,你只需輕輕點擊一個按鈕,就可以創建和公開數據庫上所有的CRUD操作。

Hyperlambda是一種動態編程語言,也是一種DSL,它不需要編譯,但是它能夠快速處理這些類型的操作,因為每個Hyperlambda關鍵字只不過是C#中的類的封裝。

因此,我們很容易創建Hyperlambda“關鍵字”,並通過這些關鍵字對客戶端進行身份驗證和授權、將記錄插入到我們的數據庫中、讀取記錄等,所有的操作只需幾行代碼即可實現。它的語法非常容易理解,而且計算機也很容易理解,這樣用戶可以通過對關鍵字的排列來創建代碼的腳手架。

演示過程:https://youtu.be/ncH4QRpKvx0

在這段視頻中,Magic首先會讀取數據庫中每個表的數據庫架構。然後,創建四個Hyperlambda文件,每個CRUD操作一個文件。這些Hyperlambda文件的路徑取決於數據庫對象的名稱,因此,假設數據庫名為“ foo”,表名為“ bar”,那麼HTTP GET的路徑為“/files/magic/foo/bar.get.hl”,指向包含Hyperlambda文件的磁盤物理路徑。

接下來,我通過一個動態路由控制器接受“/magic”下面的“任何” URL。該路由負責解析我的Hyperlambda文件,並根據給出的URL,執行相應的HTTP動詞。

那麼,現在我可以在運行時自動創建Hyperlambda代碼了,這些代碼可以封裝現有的數據庫,卻不會中斷應用程序的正常使用。此外,我還通過一個路由機制將HTTP請求動態路由到服務器中的文件和文件夾(之前創建的文件)。

對於小規模的簡單應用程序來說,整個後端的Web API就這麼多,下一步你可以立即開始創建Angular或React的前端了。而複雜的應用程序可能需要上面沒有提供的其他功能,但是至少你的後端已有了基本的雛形,接下來你可以隨意編寫C#代碼和.Net控制器。

Magic基本上就相當於“面向.Net Core和C# 的Django”。即使你的應用根本不需要CRUD,但如果你使用MySQL或微軟的SQL Server,它仍然可以作為一個出色數據庫管理系統,幫助你在生產和開發環境中管理數據庫。從這個角度來說,它相當於“面向.Net Core的PHPMyAdmin”。

如何在 40 秒内创建一个.Net Core Web API?

功能簡介

Magic可以自動處理身份驗證和授權。例如,可以為每個HTTP端點分配一個“角色”列表(以逗號分隔),客戶端必須經過身份驗證才能執行端點的代碼。這個實現採用了JWT令牌,它會在調用“身份驗證” HTTP端點時生成並返回給客戶端。

由於Magic本身可以兼容所有的數據庫,因此仍需要在這些方面進行一些手工操作。但實際上只是複製/粘貼的工作,你可以根據需要在生產中進行。順便說一句,有人可能對密碼存儲感興趣,我在這裡說明一下:密碼的存儲採用了BlowFish散列(“慢散列”),還支持獨立的加鹽算法。

你還可以通過Magic通知腳手架代碼的生成過程,要求將各個端點上的HTTP請求寫入日誌。默認情況下,Magic使用log4net,但你可以創建自己的日誌接口並替換,然後通過依賴注入提供給Magic。實際上,Magic中的所有內容都是基於IoC和依賴注入的。

另外,你可以聲明希望它提供支持的CRUD操作。例如,某些數據庫表可能是“只讀”,在這種情況下你根本不需要刪除或更新端點。你只需修改生成腳手架代碼過程中的一個簡單的複選框。

Magic超級快。首先,每個Hyperlambda文件的大小都很小——大約只有10-20行代碼。因此,與執行和處理針對某些數據庫的SQL命令的昂貴過程相比,解析和評估Hyperlambda文件幾乎沒有成本。

因此,這種“微小的Hyperlambda層”幾乎沒有額外的成本。此外,Hyperlambda的評估過程也已經優化到了極致。Hyperlambda本質上是百分百“異步”,這意味著它在評估Hyperlambda文件時也會使用C#和CLR的異步功能。因此,可以帶來巨大的“吞吐量”,並提供了可擴展性功能,以方便應用到任何“純” C#或.NET的應用程序中。如果你問我的看法,那麼我會告訴你一行代碼都不用寫,難道不夠偉大嗎?

通過你自己的關鍵字擴展Hyperlambda就像創建一個簡單的C#類一樣容易。下面是一個真實的示例,我使用了自己的一個關鍵字[strings.starts-with],如果某個字符串以其他字符串開頭則返回true。

<code>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<string>
.StartsWith(input.Children.First.GetEx<string>, StringComparison.InvariantCulture);
}
}

}
/<string>/<string>/<code>

創建自己的關鍵字就像向類添加屬性和接口一樣簡單,而且你還有一個新的“ Hyperlambda關鍵字”。這個功能為編程語言提供了一些極端的“DSL功能”。由此產生的Hyperlambda更方便人類的閱讀和理解。

然而,你無需瞭解Hyperlambda即可使用Magic,因為你的計算機明白如何創建和維護Hyperlambda。因此,Hyperlambda與Magic的關係就相當於CLR代碼與C#。

如下示例演示了一個Hyperlambda HTTP端點。請注意,由於Hyperlambda是我自己創建的,因此在DZone甚至在Visual Studio Code中都沒有辦法高亮顯示Hyperlambda,據我所知,Hyperlambda在全球範圍內只有不到5個用戶。

但是,我有一個基於JavaScript的Hyperlambda編輯器,它是Magic不可或缺的部分,它可以在你的代碼中高亮顯示Hyperlambda語法,而且也可以自動補齊。

<code>/*
* 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/*
/<code>

注意:Magic是一個全新的項目,可能包含一些bug。它還未能在GitHub上贏得一百萬顆星,而且據我所知,目前沒有任何納斯達克上市公司在使用它。因此,如果你想對其進行評估,請耐心等待。我會全力以赴提高代碼的質量,並且修改所有發現的bug。將來我會持續維護該項目,但有時可能會出現一些測試版中常見的問題。

你可以通過我的GitHub代碼庫(https://github.com/polterguy/magic)彙報bug或請求功能。即便你沒有可以彙報的bug,我也希望你對該項目提出建議或給予鼓勵。

如何在 40 秒内创建一个.Net Core Web API?

總結

總的來說,Magic可以減輕你一半的工作量,讓計算機來承擔無聊的工作,而你則可以專注於有趣的工作。這不正是我們發明計算機的初衷嗎?希望你能找到Magic帶來的快樂。

有關Magic的詳細信息如下:

  • 主頁:https://polterguy.github.io/

  • GitHub項目網站:https://github.com/polterguy/magic

  • 支持系統:https://github.com/polterguy/magic/issues

原文:https://dzone.com/articles/creating-a-net-core-web-api-in-40-seconds

本文為 CSDN 翻譯,轉載請註明來源出處。

【END】


分享到:


相關文章: