Slide 1

Slide 1 text

Aspire をカスタマイズしよう & Aspire 9.2 .NET ラボ 2025/04/26 何縫ねの。

Slide 2

Slide 2 text

自己紹介 1 • 所属: NTTコミュニケーションズ イノベーションセンター • Microsoft MVP for Developer Technologies (2024~) • .NET / Web Development • 趣味: C#, OSS, ドール, 一眼(α7 IV), シーシャ • 執心領域 • C# ⇔ TypeScript • SignalR • Observability / OpenTelemetry 何縫ねの。 nenoNaninu nenoMake ブログ https://blog.neno.dev その他 https://neno.dev

Slide 3

Slide 3 text

OSS 紹介 2 属性を付与するだけ Tapper • C# の型定義から TypeScript の型定義を生成する .NET Tool/ library • JSON / MessagePack 対応! https://github.com/nenoNaninu/Tapper

Slide 4

Slide 4 text

OSS 紹介 3 • C# の SignalR Client を強く型付けするための Source Generator TypedSignalR.Client Before After (using TypedSignalR.Client) こんな SignalR の Hub と Receiver の interface が あったとして… 脱文字列! 全てが強く型付け! https://github.com/nenoNaninu/TypedSignalR.Client

Slide 5

Slide 5 text

4 • TypeScript の SignalR Client を強く型付けするための .NET Tool / library TypedSignalR.Client.TypeScript Before After (using TypedSignalR.Client.TypeScript) 脱文字列! 全てが強く型付け! TypeScript 用の型を C# から自動生成 MessagePack Hub Protocol 対応! https://github.com/nenoNaninu/TypedSignalR.Client.TypeScript 属性を付与するだけ! OSS 紹介

Slide 6

Slide 6 text

5 • SignalR 使ったアプリを快適に開発するための GUI を自動生成する library • 2 step で利用可能! • http pipeline に middleware の追加 • Hub と Receiver を定義してる interface に属性を付与 • JWT 認証 サポート • パラメータのユーザ定義型サポート • JSON で入力! SignalR 版 SwaggerUI TypedSignalR.Client.DevTools https://github.com/nenoNaninu/TypedSignalR.Client.DevTools OSS 紹介

Slide 7

Slide 7 text

AspNetCore.SignalR.OpenTelemetry OSS 紹介 6 https://github.com/nenoNaninu/AspNetCore.SignalR.OpenTelemetry • トレースのための計装 • 最低限のログ • 接続時 • Transport 層の情報も出力(WebSocket 等) • メソッド呼び出し時 • HubName.MethodName の素朴なログ • メソッド呼び出し毎にログのスコープを追加 • HubName, MethodName, InvocationId を 振っているのでログの検索性が向上 • Duration • 切断時 • 切断時に例外が発生していれば例外もログに出力 Inspired by HttpLogging SignalR のメソッド呼び出し毎に スパンが切られるように https://github.com/nenoNaninu/AspNetCore.SignalR.OpenTelemetry

Slide 8

Slide 8 text

7 ブログ記事 めちゃくちゃ 気合を入れて書いたのでぜひ…! https://blog.neno.dev/entry/2025/04/14/130323 直近に公開した記事

Slide 9

Slide 9 text

お品書き 8 • Aspire とは • Aspire をカスタマイズしよう • Aspire 9.2 の新機能

Slide 10

Slide 10 text

Aspire とは 9

Slide 11

Slide 11 text

Aspire とは 10 以前の登壇資料を参照してください…! https://speakerdeck.com/nenonaninu/fen-jie-siteli-jie-suru-aspire

Slide 12

Slide 12 text

Aspire とは 11 Aspire が提供してくれる事は主に3つ 分散アプリケーションの開発のためのローカル開発環境 • 現時点においてはこれが主な価値 • 実は(?)分散アプリケーションの開発ではなくても十分利用する価値がある 分散アプリケーションのテスト • 分散アプリケーションのテストがだいぶ書きやすくなる クラウドへのデプロイ • 現時点においてこれを目的で Aspire 使うのはあまりおススメしない https://speakerdeck.com/nenonaninu/fen-jie-siteli-jie-suru-aspire?slide=21

Slide 13

Slide 13 text

Aspire をカスタマイズしよう 12

Slide 14

Slide 14 text

Aspire をカスタマイズしよう 13 素朴に使うだけで十分いろいろな事をやってくれる • 必要なコンポーネントの一括起動 • .NET プロジェクト • コンテナ • 実行ファイル • コンポーネント間通信のための URI / 接続文字列 • OpenTelemetry 関連 • 開発用ダッシュボード

Slide 15

Slide 15 text

Aspire をカスタマイズしよう 14 それ以上を望もう • 開発時にいろいろツール使っていませんか? • Aspire に組み込めそうなものなら組み込んでしまおう…!

Slide 16

Slide 16 text

Aspire をカスタマイズしよう 15 自分の場合は gRPC UI だった • 自分は gRPC service を開発する際に gRPC UI を愛用していた • SwaggerUI みたいに GUI ぽちぽちして叩きたいからね…! https://github.com/fullstorydev/grpcui

Slide 17

Slide 17 text

Aspire をカスタマイズしよう 16 自分の場合は gRPC UI だった • 自分は gRPC service を開発する際に gRPC UI を愛用していた • SwaggerUI みたいに GUI ぽちぽちして叩きたいからね…! https://github.com/fullstorydev/grpcui

Slide 18

Slide 18 text

Aspire をカスタマイズしよう 17 自分の場合は gRPC UI だった • 自分は gRPC service を開発する際に gRPC UI を愛用していた • SwaggerUI みたいに GUI ぽちぽちして叩きたいからね…! https://github.com/fullstorydev/grpcui 毎回 CLI 叩くのだるい…!

Slide 19

Slide 19 text

Aspire をカスタマイズしよう 18 そうだ Aspire に組み込んでしまえ

Slide 20

Slide 20 text

OSS 紹介 19 https://github.com/nenoNaninu/AspireExtensions.GrpcUI AppHost で gRPC service のプロジェクトに対して WithGrpcUI をメソッドチェーンでつなげてあげる事で ダッシュボードからボタン一つで gRPC UI が起動可能…! AspireExtensions.GrpcUI

Slide 21

Slide 21 text

OSS 紹介 20 https://github.com/nenoNaninu/AspireExtensions.GrpcUI AspireExtensions.GrpcUI

Slide 22

Slide 22 text

OSS 紹介 21 https://github.com/nenoNaninu/AspireExtensions.GrpcUI AspireExtensions.GrpcUI

Slide 23

Slide 23 text

OSS 紹介 22 gRPC UI が使いたくなったら ダッシュボードから立ち上げる https://github.com/nenoNaninu/AspireExtensions.GrpcUI AspireExtensions.GrpcUI

Slide 24

Slide 24 text

OSS 紹介 23 https://github.com/nenoNaninu/AspireExtensions.GrpcUI AspireExtensions.GrpcUI

Slide 25

Slide 25 text

OSS 紹介 24 https://github.com/nenoNaninu/AspireExtensions.GrpcUI AspireExtensions.GrpcUI

Slide 26

Slide 26 text

OSS 紹介 25 https://github.com/nenoNaninu/AspireExtensions.GrpcUI AspireExtensions.GrpcUI 現れた URL をクリックすれば gRPC UI に飛べる…!

Slide 27

Slide 27 text

OSS 紹介 26 https://github.com/nenoNaninu/AspireExtensions.GrpcUI AspireExtensions.GrpcUI 現れた URL をクリックすれば gRPC UI に飛べる…!

Slide 28

Slide 28 text

Aspire をカスタマイズしよう 27 • AspireExtensions.GrpcUI はぺら1ライブラリ…! • なので皆さんも使っているツールとかあれば 簡単に Aspire に組み込めます…! 特段難しい事はしてない…!

Slide 29

Slide 29 text

Aspire をカスタマイズしよう 28 https://github.com/nenoNaninu/AspireExtensions.GrpcUI ぶっちゃけこれだけ…!

Slide 30

Slide 30 text

Aspire をカスタマイズしよう 29 https://github.com/nenoNaninu/AspireExtensions.GrpcUI ぶっちゃけこれだけ…! 中身をみてきましょう

Slide 31

Slide 31 text

• Aspire には RunMode / PublishMode がある • 開発時に Aspire を立ち上げる場合は RunMode • Bicep / Terraform などを吐き出すときは PublishMode • AspireExtensions.GrpcUI は開発時にのみ使えれば OK なので RunMode かどうかを確認 Aspire をカスタマイズしよう 30 ExecutionContext.IsRunMode https://github.com/nenoNaninu/AspireExtensions.GrpcUI

Slide 32

Slide 32 text

Aspire をカスタマイズしよう 31 gRPC UI が存在するかどうかを確認 • AspireExtensions.GrpcUI では gRPC UI の実行ファイルに依存している • gRPC UI の実行ファイルが存在するかチェック • 存在しなければコンソールにメッセージを流してあげる https://github.com/nenoNaninu/AspireExtensions.GrpcUI

Slide 33

Slide 33 text

Aspire をカスタマイズしよう 32 実行ファイルかコンテナか https://github.com/nenoNaninu/AspireExtensions.GrpcUI • AspireExtensions.GrpcUI は gRPC UI の実行ファイルに依存している • 事前に gRPC UI をインストールしておく必要がある • 実行ファイルではなくコンテナに依存していれば、 ユーザは事前に gRPC UI をインストールしておく必要はない • Aspire がよしなにイメージを引っ張ってきてくれる • gRPC UI は公式にコンテナのイメージを用意していない

Slide 34

Slide 34 text

Aspire をカスタマイズしよう 33 実行ファイルかコンテナか https://github.com/nenoNaninu/AspireExtensions.GrpcUI • AspireExtensions.GrpcUI は gRPC UI の実行ファイルに依存している • 事前に gRPC UI をインストールしておく必要がある • 実行ファイルではなくコンテナに依存していれば、 ユーザは事前に gRPC UI をインストールしておく必要はない • Aspire がよしなにイメージを引っ張ってきてくれる • gRPC UI は公式にコンテナのイメージを用意していない このライブラリ使うためだけに Unofficial なイメージが DL されるのも嫌じゃろう… という事で実行ファイルを事前に DL してもらう形に

Slide 35

Slide 35 text

Aspire をカスタマイズしよう 34 AddExecutable https://github.com/nenoNaninu/AspireExtensions.GrpcUI

Slide 36

Slide 36 text

Aspire をカスタマイズしよう 35 AddExecutable https://github.com/nenoNaninu/AspireExtensions.GrpcUI 実行ファイルを指定 引数はこの時点では組み立てられないので空 (GetEndpoints がこのタイミングでは有効な値を返してくれない)

Slide 37

Slide 37 text

Aspire をカスタマイズしよう 36 AddExecutable https://github.com/nenoNaninu/AspireExtensions.GrpcUI Port を指定しておかないと ダッシュボード上に URL が現れない プロキシは不要なので切る 実行ファイルを指定 引数はこの時点では組み立てられないので空 (GetEndpoints がこのタイミングでは有効な値を返してくれない)

Slide 38

Slide 38 text

Aspire をカスタマイズしよう 37 AddExecutable https://github.com/nenoNaninu/AspireExtensions.GrpcUI gRPC service の endpoint を取得して http か https かで grpcui に渡す引数を調整 実行ファイルを指定 引数はこの時点では組み立てられないので空 (GetEndpoints がこのタイミングでは有効な値を返してくれない) Port を指定しておかないと ダッシュボード上に URL が現れない プロキシは不要なので切る

Slide 39

Slide 39 text

Aspire をカスタマイズしよう 38 AddExecutable https://github.com/nenoNaninu/AspireExtensions.GrpcUI WithExplicitStart を叩く事で 必要に応じて dashboard 上から起動できる gRPC service の endpoint を取得して http か https かで grpcui に渡す引数を調整 実行ファイルを指定 引数はこの時点では組み立てられないので空 (GetEndpoints がこのタイミングでは有効な値を返してくれない) Port を指定しておかないと ダッシュボード上に URL が現れない プロキシは不要なので切る

Slide 40

Slide 40 text

Aspire をカスタマイズしよう 39 これだけ!

Slide 41

Slide 41 text

Aspire をカスタマイズしよう 40 これだけ! という事で皆さんも Aspire を カスタムして開発体験を向上させましょう…!

Slide 42

Slide 42 text

Aspire 9.2 の新機能 41

Slide 43

Slide 43 text

Aspire 9.2 42 2025-04-11 に Aspire 9.2 がリリースされました…! • 個人的には Publishers + Aspire CLI がアツい…! • ただし 9.2 段階では Preview • Aspire を用いたテストの xUnit v3 / Microsoft.Testing.Platform 対応 • ダッシュボードの強化 https://learn.microsoft.com/en-us/dotnet/aspire/whats-new/dotnet-aspire-9.2

Slide 44

Slide 44 text

Aspire 9.2 43 Aspire 9.1 時点で bicep 等を publish するための方式 https://github.com/aws/integrations-on-dotnet-aspire-for-aws/issues/50

Slide 45

Slide 45 text

Aspire 9.2 44 Aspire 9.1 時点で bicep 等を publish するための方式 https://github.com/aws/integrations-on-dotnet-aspire-for-aws/issues/50 返ってきた intermediate manifest format に従った JSON を ガチャガチャいじくる必要があった(つらい)

Slide 46

Slide 46 text

Aspire 9.2 45 Aspire 9.2 からの新しい publish の方式 https://github.com/aws/integrations-on-dotnet-aspire-for-aws/issues/50

Slide 47

Slide 47 text

Aspire 9.2 46 Aspire 9.2 からの新しい publish の方式 https://github.com/aws/integrations-on-dotnet-aspire-for-aws/issues/50 JSON を介さずに C# で全て解決…!

Slide 48

Slide 48 text

Aspire 9.2 47 Aspire 9.2 からの新しい publish の方式

Slide 49

Slide 49 text

Aspire 9.2 48 Aspire 9.2 からの新しい publish の方式

Slide 50

Slide 50 text

Aspire 9.2 49 Aspire 9.2 からの新しい publish の方式 docker-compose.yml が 出力される…!

Slide 51

Slide 51 text

Aspire 9.2 50 Aspire のテストが次世代の形式に対応 • 事前知識 • 今までの dotnet test および Test Explorer は VSTest に依存していた • VSTest はもう結構な年季もので、だいぶ複雑になっている • そこで VSTest の代替となる Microsoft.Testing.Platform が開発された • xUnit.v3 は Microsoft.Testing.Platform に対応している • オプションでMicrosoft.Testing.Platform を用いるか切り替えられる • Aspire のテストが xUnit.v3 及び Microsoft.Testing.Platform に対応した https://xunit.net/docs/getting-started/v3/whats-new https://xunit.net/docs/getting-started/v3/microsoft-testing-platform https://learn.microsoft.com/en-us/dotnet/core/testing/microsoft-testing-platform-intro

Slide 52

Slide 52 text

Aspire 9.2 51 Aspire のテンプレートのインストール Aspire + xunit.v3 + Microsoft.Testing.Platform の 新規プロジェクトを作成

Slide 53

Slide 53 text

Aspire 9.2 52 テストテンプレートの csproj に少し手を加えたほうが better

Slide 54

Slide 54 text

Aspire 9.2 53 カスタム HTTP コマンド • カスタムコマンド自体は Aspire 9.0 時点からある • カスタム HTTP コマンドが Aspire 9.2 から導入

Slide 55

Slide 55 text

Aspire 9.2 54 カスタム HTTP コマンド • カスタムコマンド自体は Aspire 9.0 時点からある • カスタム HTTP コマンドが Aspire 9.2 から導入

Slide 56

Slide 56 text

Aspire 9.2 55 カスタム HTTP コマンド • カスタムコマンド自体は Aspire 9.0 時点からある • カスタム HTTP コマンドが Aspire 9.2 から導入

Slide 57

Slide 57 text

Aspire 9.2 56 ダッシュボード強化 • リソースグラフ • リソースアイコン • リソースアイコンの色とトレースの色が一致しているのが嬉しいポイント • テレメトリの一時停止 • コンソールログのタイムスタンプを UTC に

Slide 58

Slide 58 text

まとめ 57 Aspire をカスタマイズしていこう 普段使っている開発用ツールの Aspire への組み込み • e.g., AspireExtensions.GrpcUI • https://github.com/nenoNaninu/AspireExtensions.GrpcUI カスタムコマンド・カスタム HTTP コマンド • ダッシュボードからのアクションの拡張 Publishers + Aspire CLI (Preview) • 自分の望むデプロイ先用への Terraform などを出力するよう カスタムする事が C# の世界のみで完結可能に (脱 JSON依存)