より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

DIライブラリをUnityContainerからMicrosoft.Extensions.DependencyInjectionへ乗り換え

発端は既存コードをUnityで使いたいからでした。

しかし、UnityContainerは名前空間は同じUnityで衝突してしまうのです。

気づくと、とっくにサポートは終わっていたのです。

github.com

世の中は常に変化してるものなんですね……。

そこで何を使うか考えたところ、Microsoft.Extensions.DependencyInjectionにしました。

www.nuget.org

Microsoftがサポートしてますし、UnityNugetでも取得可能なライブラリということもあり、すんなり決まりました。

DIライブラリに要求することなんて、登録と取得しかありません。

単純な置換でほぼほぼ解決しました。

仕様の違いとして、

  • 登録はServiceCollectionに対して行う。取得はServiceProvider経由。
  • 登録後にServiceProviderを生成しないとダメ。(これが面倒)

なので、途中まで登録して、後から追加がしづらいのです。

staticクラスに集約していたので、以下のようにしました。

    public static class ContainerSource
    {
        static ContainerSource()
        {
            RebuildServiceProvider();
        }

        public static ServiceProvider Container { get; set; }

        private static readonly ServiceCollection ServiceCollection = new ServiceCollection();

        private static void RebuildServiceProvider()
        {
            Container?.Dispose();
            Container = ServiceCollection.BuildServiceProvider();
        }

        public static void AddSingleton<TService>(TService instance) where TService : class
        {
            ServiceCollection.AddSingleton<TService>(instance);
            RebuildServiceProvider();
        }
}

呼び出し方としては

                ContainerSource.AddSingleton<IScriptService>(new ScriptService());

みたいな感じで呼びます。