.NET MAUIのDI(Dependency Injection)について、プラットフォーム別に登録する方法を紹介していきます。
.NET MAUIのDIは、Xamarinに比べてプラットフォーム別に実装することが容易になっています。
DIとは何か?
DIは、「Dependency Injection」の略で依存性注入と呼ばれています。
デザインパターンの一つでオブジェクト間の依存関係を実行時に注入する手法になります。実行時に注入することができるため、スタブを用意して単体テストを行うこともできます。
共通の場所とプラットフォーム別の場所
.Net MAUIでは、全プラットフォームで利用される場所とプラットフォーム別に利用される場所があります。
プラットフォーム別に利用される場所は「Platforms\〇〇」になります。それ以外は、基本的に全プラットフォームで利用されます。
インターフェイスの準備
依存関係を登録するためにインターフェイスを用意する必要があります。インターフェイスは共通の場所に用意します。
次の例は「DI\IPlatformGetter.cs」でインターフェイスを準備してみました。
「IPlatformGetter.cs」の中身は次のようにしています。
namespace SampleMaui.DI
{
public interface IPlatformGetter
{
public string Get();
}
}
プラットフォーム別の実装
プラットフォーム別に実装するためには「Platforms\〇〇」の場所を利用します。プラットフォーム別に実装していきますが、クラス名はすべて同じにしてください。
次の例は「Platforms\〇〇\DI\PlatformGetter.cs」でプラットフォーム別に実装しています。クラス名を「PlatformGetter」で統一しています。
「PlatformGetter.cs」の中身はプラットフォームを返却するようにしています。
using SampleMaui.DI;
namespace SampleMaui.Platforms.Windows.DI
{
public class PlatformGetter : IPlatformGetter
{
public string Get()
{
return "Windows";
}
}
}
依存関係の登録
プラットフォーム別に処理を分けるためには、依存関係の登録もプラットフォーム別に行う必要があります。そこで、プリプロセッサ ディレクティブ(#if、#elif、#else、#endif)を利用していきます。
実装例は次のようになります。
using SampleMaui.DI;
#if WINDOWS
using SampleMaui.Platforms.Windows.DI;
#elif ANDROID
using SampleMaui.Platforms.Android.DI;
#elif IOS
using SampleMaui.Platforms.iOS.DI;
#elif MACCATALYST
using SampleMaui.Platforms.MacCatalyst.DI;
#endif
namespace SampleMaui;
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
// ===== 略 =====
builder.Services.AddSingleton<IPlatformGetter, PlatformGetter>();
// ===== 略 =====
return builder.Build();
}
}
ちなみに
プラットフォーム別に実装したクラスの名前空間も合わせることでプリプロセッサ ディレクティブが不要になります。この方法は、クラスを追加した際に自動で記載される名前空間を修正する必要があり、修正漏れに気を付ける必要があります。
実装例は次のようになります。
namespace SampleMaui.DI
{
public class PlatformGetter : IPlatformGetter
{
public string Get()
{
return "Windows";
}
}
}
using SampleMaui.DI;
namespace SampleMaui;
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
// ===== 略 =====
builder.Services.AddSingleton<IPlatformGetter, PlatformGetter>();
// ===== 略 =====
return builder.Build();
}
}
おわりに
XamarinでもDIは利用できましたが、プラットフォーム別の実装は.NET MAUIでとても便利になったと思います。プリプロセッサ ディレクティブは、DebugとReleaseの切り分け程度イメージでしたが、プラットフォームの切り分けにも利用できることは驚きました。
今回、紹介した方法を利用した記事がありますので紹介します。よければ見てください!!