発端は既存コードをUnityで使いたいからでした。
しかし、UnityContainerは名前空間は同じUnityで衝突してしまうのです。
気づくと、とっくにサポートは終わっていたのです。
世の中は常に変化してるものなんですね……。
そこで何を使うか考えたところ、Microsoft.Extensions.DependencyInjectionにしました。
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());
みたいな感じで呼びます。