事前生成されたクライアントコード
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.IGreeterService
と MyApp.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
です