Skip to content

Latest commit

 

History

History
183 lines (131 loc) · 5.01 KB

File metadata and controls

183 lines (131 loc) · 5.01 KB

スクリプトの拡張

.NET のクラス・独自サービスをスクリプトから呼べるようにするには、 ユーザーコードの IAppInfoService 実装の中で ScriptRuntimeTypeManager に登録します。

VS テンプレートで作ったプロジェクトでは WebApp.Client.Shared/Services/AppInfoService.cs がその場所です。

public class AppInfoService : IAppInfoServiceExtension
{
    readonly ScriptRuntimeTypeManager _scriptRuntimeTypeManager = new();

    public AppInfoService(...)
    {
        // ↓ ここで型・サービスを登録する
        _scriptRuntimeTypeManager.AddType<MyType>();
        _scriptRuntimeTypeManager.AddService(new MyService(...));
    }

    public ScriptRuntimeTypeManager GetScriptRuntimeTypeManager()
        => _scriptRuntimeTypeManager;
}

AddType — 型を追加

スクリプトから new T() で作れる型、または静的メンバを呼び出せる型として登録します。

_scriptRuntimeTypeManager.AddType<MemoryStream>();
_scriptRuntimeTypeManager.AddType(typeof(Math));
_scriptRuntimeTypeManager.AddType<MidpointRounding>();

スクリプト側:

var ms = new MemoryStream();
var v = Math.Round(1.23, MidpointRounding.AwayFromZero);

登録される性質

AddType で渡された型は、内部で次のように分類されます。

型の特徴 スクリプトでの扱い
enum EnumName.Member で値が取れる
公開コンストラクタを持つ new T() で生成可能
インスタンスメンバを持つ 受け取った値のメソッドを呼べる
静的メンバを持つ 型名でアクセス可能(例: Math.PI

同名の型が登録済みなら無視されます。先勝ちです。


AddService — サービスを追加

シングルトンとして登録します。スクリプト内では型名で直接アクセスできます。

_scriptRuntimeTypeManager.AddService(new WebApiService(http, logger));
_scriptRuntimeTypeManager.AddService(new MyAppContext(...));

スクリプト側:

var data = await WebApiService.Get("/testapi").JsonObject;
var user = MyAppContext.CurrentUser;

サービス内に依存性を注入する

サービスやスクリプト内で new した型に対して、Codeer.LowCode.Blazor.RequestInterfaces.Services などを注入できます。 注入したいプロパティに [ScriptInject] を付けます。

public class MyService
{
    [ScriptInject]
    public Services? Services { get; set; }   // ランタイムが自動で入れる

    public async Task DoWork() => await Services!.Logger.Log("hello");
}

任意の型を注入する

AddCustomInjector を使うと、独自の型をプロパティに注入できます。

_scriptRuntimeTypeManager.AddCustomInjector(() => http);   // HttpService を注入

public class MyApi
{
    [ScriptInject]
    public HttpService? Http { get; set; }
}

ScriptHide / ScriptName

公開する型・サービスのメンバを細かく制御するための属性です。

属性 用途
[ScriptHide] スクリプトから見えないようにする(補完にも出ない)
[ScriptName("Foo")] スクリプト内での名前を変える(例: FooAsyncFoo で呼ばせる)
public class MyService
{
    [ScriptHide]
    public Services? Services { get; set; }

    [ScriptName("SendEmail")]
    public async Task<bool> SendEmailAsync(string to, string subject, string body)
    {
        ...
    }
}

スクリプト側:

await MyService.SendEmail("a@b", "subject", "body");

Designer 側でも認識させる

AddType / AddService で登録した型は、デザイナのスクリプトエディタの補完にも反映されます。デザイナ拡張については デザイナのカスタマイズ を参照してください。


例: 独自 WebAPI サービスを追加

1. サービスを書く

public class WeatherApiService
{
    [ScriptInject]
    public HttpService? Http { get; set; }

    [ScriptName("GetCurrent")]
    public async Task<WebApiResult> GetCurrentAsync(string city)
        => await Http!.GetAsync($"/api/weather?city={city}");
}

2. AppInfoService に登録

_scriptRuntimeTypeManager.AddService(new WeatherApiService());

3. スクリプトで使う

async Task ShowButton_OnClick()
{
    var result = await WeatherApiService.GetCurrent("Tokyo");
    Toaster.Success($"{result.JsonObject.temp} ℃");
}

関連項目