web-dev-qa-db-ja.com

IServiceCollectionにサービスが既に追加されているかどうかを確認する方法

ライブラリのIServiceCollectionを介したインターフェイスの構成と注入を簡素化するヘルパークラスを作成しています。ライブラリコンストラクターには、以前に注入された可能性が高いいくつかの依存関係が含まれています。それらがIServiceCollectionにまだ挿入されていない場合は、ヘルパークラスで追加する必要があります。インターフェイスがすでに挿入されているかどうかをどのように検出しますか?

public static void AddClassLibrary(this IServiceCollection services
    , IConfiguration configuration)
{
     //Constructor for ClassLibrary requires LibraryConfig and IClass2 to be in place
     //TODO: check IServiceCollection to see if IClass2 is already in the collection. 
     //if not, add call helper class to add IClass2 to collection. 
     //How do I check to see if IClass2 is already in the collection?
     services.ConfigurePOCO<LibraryConfig>(configuration.GetSection("ConfigSection"));
     services.AddScoped<IClass1, ClassLibrary>();
}
22
Dan Doney

Microsoftは、サービスが既に存在する場合に追加されないようにする拡張メソッドを組み込んでいます。例えば:

// services.Count == 117
services.TryAddScoped<IClass1, ClassLibrary>();
// services.Count == 118
services.TryAddScoped<IClass1, ClassLibrary>();
// services.Count == 118

それらを使用するには、次のusingディレクティブを追加する必要があります。

using Microsoft.Extensions.DependencyInjection.Extensions;

組み込みメソッドがニーズを満たさない場合は、ServiceTypeを確認することで、サービスが存在するかどうかを確認できます。

if (!services.Any(x => x.ServiceType == typeof(IClass1)))
{
    // Service doesn't exist, do something
}
47
NightOwl888