プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2019/12/11

[.NET Core] 同じインターフェイスで異なる実装を DI コンテナに登録し、区別して取り出す

event_note2019/12/11 10:13

やり方はいろいろあるかもしれませんが、個人的に一番簡単だと思った方法です。

環境

  • Visual Studio 2017
  • .NET Core 2.2

実体を区別しない場合

以下の過去記事を参考にしてください。

今回は DI した側で実体を区別したい場合です。

サンプル

例えば、以下のような IFoo を実装した複数のクラスがあったとします。

public class ServiceA : IFoo {}
public class ServiceB : IFoo {}
public class ServiceC : IFoo {}

これを、全て IFoo として登録しつつ、区別できるようにキーを付与します。
つまり、Dictionary として登録します。

services.AddSingleton<IDictionary<string, IFoo>>(new Dictionary<string, IFoo>()
{
    [nameof(ServiceA)] = new ServiceA (),
    [nameof(ServiceB)] = new ServiceB (),
    [nameof(ServiceC)] = new ServiceC (),
});

DI される側では以下のようにして使います。

public Sample(IDictionary<string, IFoo> services)
{
    var service = services[nameof(ServiceA)];
}