繁體中文
English 简体中文 繁體中文
Methodox 首頁

開發

用 C# 編寫筆記本

筆記本是一個派生自 NotebookApplication 並重寫 Build 的類。它的成員是每位存取者各自一份的,與文件的資料成員完全一樣:

using Divooka.Application.Notebook;
using Divooka.Application.Notebook.Framework;

public class Greenhouse : NotebookApplication
{
    public double Temperature { get; set; }

    protected override void Build()
    {
        Site("Greenhouse");
        Page("Yield");
        Markdown("# Crop yield");
        Slider("Temperature (°C)", 0, 40, 24, t => { Temperature = t; return $"{t} °C"; });
        TextBox("Region", "North", region => NotebookOutputs.Markdown($"**{region}** at {Temperature} °C"));
    }
}

NotebookApplicationProvider provider = new(new Greenhouse(), () => new Greenhouse());
await using NotebookHost host = await NotebookHost.StartAsync(provider, new NotebookHostOptions { Address = "127.0.0.1:5080" });

提供程式會獲得站點自己的例項,以及為每位存取者建立另一個例項的方法;由 Compute 或 dvn 執行的文件,這兩者都由框架提供。

包

包 說明
Divooka.Application.Notebook.Application NotebookApplication、儲存格和輸出值。不引用任何 Web 庫,因此筆記本文件自身的引用保持精簡。
Divooka.Application.Notebook.Framework 驅動程式、NotebookHost、NotebookApplicationProvider、從 Divooka 值到輸出的對映,以及自檢功能。
Divooka.Application.Notebook ASP.NET Core 伺服器,內嵌頁面客戶端:AddDivookaNotebook 和 MapDivookaNotebook。
Divooka.Application.Notebook.Base 通訊契約和提供程式介面。

擁有自己頁面的宿主可以實現 INotebookPagesProvider 和 INotebookSessionComputeProvider,並用 AddDivookaNotebook 和 MapDivookaNotebook 把伺服器對映到自己的應用程式中。

通訊協議

頁面通過一個小型 JSON API 與伺服器通訊。該 API 帶有版本號,因此從較舊伺服器快取的頁面會提示重新載入,而不會誤讀響應。它包括:每次頁面載入時的一次引導請求,用於建立會話;每次更改時的一次呼叫,響應內容為該儲存格的輸出以及啟用狀態的任何變化;上傳;以及頁面離開時傳送的關閉請求。它的規範見伺服器原始碼旁的 PROTOCOL.md,位於 Parcel.NExT/Packages/Divooka.Application.Notebook。

頁面客戶端

頁面使用 DivookaFrontendComponents(Divooka 生態系統共享的 React 元件)構建,並在伺服器構建時嵌入其中。因此,從原始碼構建伺服器需要 Node.js,以及位於 External/DivookaFrontendComponents 的元件克隆(External/Setup.ps1 會克隆它);構建過程會提示缺少哪一項。

測試

UnitTests/Divooka.Application.Notebook.UnitTests 在真實的環回埠上提供筆記本服務,並通過 API 驅動它們:測試存取者之間相互隔離、同一次存取內共享成員、通過編輯器會話編寫的文件以解釋和編譯兩種方式提供服務、dvn,以及隨附的示例。NOTEBOOK_CHECK=1——或 dvn --check——會讓任何筆記本存取自身一次,並列印每個儲存格的響應。