メインコンテンツまでスキップ

事前生成されたクライアントコード

MagicOnion は Unity、NativeAOT など事前生成されたクライアントコードが必要なプラットフォームを Source Generator でサポートしています。

Source Generator は MagicOnion.Client パッケージに同梱されているため、以前のバージョンのようなコード生成ツール (moc) のインストールや追加のビルドステップの設定は不要です。

サポートされている開発環境

  • Unity 2022.3.0f1 以降
  • .NET 6 以降
  • Visual Studio 2022 version 17.2 以降
  • Rider 2023.1 以降

使用方法

任意の名前の partial クラスをアプリケーション内に定義します。そして MagicOnionClientGeneration 属性を付け、サービスインターフェースを検索する対象となるアセンブリ内の任意の型を指定します。

たとえば MyApp.Shared アセンブリに MyApp.Shared.Services.IGreeterServiceMyApp.Shared.Hubs.IChatHub が含まれている場合そのうちの一つを指定します。

using MagicOnion.Client;

[MagicOnionClientGeneration(typeof(MyApp.Shared.Services.IGreeterService))]
partial class MagicOnionGeneratedClientInitializer {}

次に生成された MessagePack Resolver (MagicOnionGeneratedClientInitializer.Resolver プロパティ)を使用するように MessagePack を構成します。これは従来の MagicOnion.Generator を使用する場合と同様です。

#if UNITY_2019_4_OR_NEWER
[UnityEngine.RuntimeInitializeOnLoadMethod(UnityEngine.RuntimeInitializeLoadType.BeforeSceneLoad)]
#elif NET5_0_OR_GREATER
[System.Runtime.CompilerServices.ModuleInitializer]
#endif
static void RegisterResolvers()
{
StaticCompositeResolver.Instance.Register(
// Add: Use MessagePack formatter resolver generated by the source generator.
MagicOnionGeneratedClientInitializer.Resolver,
StandardResolver.Instance
);

MessagePackSerializer.DefaultOptions = MessagePackSerializer.DefaultOptions
.WithResolver(StaticCompositeResolver.Instance);
}

ソース生成オプション

コンストラクターの名前付き引数でオプションを指定できます。

  • DisableAutoRegistration: 起動時に <MagicOnionClientGeneration属性を付加したクラス>.Register メソッドを自動的に呼び出す機能を無効にするかどうかを設定します (自動登録は .NET 5+ または Unity でのみ機能します)
    • このオプションにより Register を呼び出さなかった場合、手動で呼び出すかクライアント作成時に ClientFactoryProvider または StreamingHubClientFactoryProvider プロパティーを渡す必要があります
  • Serializer: シリアライズに使用するシリアライザーを設定します。デフォルトは GenerateSerializerType.MessagePack です

追加のオプション

MagicOnionClientGenerationOption 属性で追加のオプションを指定できます。

MessagePack 向けには過去の mpc との互換性のためのオプションが存在します。

  • MessagePack.FormatterNamespace: 事前生成された Formatter の名前空間を指定します。デフォルトは MessagePack.Formatters です
  • MessagePack.GenerateResolverForCustomFormatter: 事前生成された MessagePack Formatter を使用するかどうかを指定します。デフォルトは false です