System.InvalidOperationException:アクティブ化の試行中にタイプのサービスを解決できません

組み込みの依存性注入機能が型を作成しようとすると、すべてのコンストラクター パラメーターを解決しようとします。パラメータの 1 つを解決できない場合、次の例外のいずれかのバリエーションがスローされます:

  • InvalidOperationException: をアクティブ化しようとしたときに、タイプ のサービスを解決できません .
  • ArgumentException:サービス タイプ「Type Name」の実装タイプ「Type Name」をインスタンス化できません .

表示されるエラーは、登録方法によって異なります。まず、解決策を示します。次に、問題のさまざまなバリエーションをいくつか示します。

解決策

最も簡単な解決策は、型を明示的に登録することです。その型にプリミティブ コンストラクター パラメーターがある場合は、その型の作成方法も正確に伝えます。

これが例です。次のコンストラクタを持つ JsonLogger というクラスがあるとします:

 public JsonLogger(string source)
Code language: C# (cs)

このタイプを明示的に登録し、作成方法を指定する必要があります:

public class Startup
{
	
	public void ConfigureServices(IServiceCollection services)
	{
		//rest of ConfigureServices()

		services.AddSingleton<ILogger>(_ => new JsonLogger("web app"));
	}

	//rest of Startup class
}
Code language: C# (cs)

プリミティブ パラメータをカプセル化する

自動的に解決できないプリミティブ パラメーターと解決できる型が混在している場合は、プリミティブ パラメーターをクラスにカプセル化することを検討してください。そうしないと、オブジェクトの作成方法を指定するときに、解決できるすべての型に対して IServiceProvider.GetService() を繰り返し呼び出す必要があります。

これが例です。次のコンストラクタがあるとします:

public JsonLogger(string source, bool debugEnabled, IUtility utility)
Code language: C# (cs)

2 つのプリミティブ パラメーターをカプセル化します。

//Pull the primitives into a new class
public class LoggerConfig
{
	public string Source { get; set; }
	public bool DebugEnabled { get; set; }
}

//Change the parameter to use the object
public JsonLogger(LoggerConfig config, IUtility utility)
Code language: C# (cs)

次に、すべてのタイプを登録します:

public class Startup
{
	public void ConfigureServices(IServiceCollection services)
	{
		//rest of method
		
		services.AddSingleton<IUtility, JsonUtility>();
		services.AddSingleton<LoggerConfig>(_ => new LoggerConfig()
		{
			Source = "web app",
			DebugEnabled = true
		});

		services.AddSingleton<ILogger, JsonLogger>();
	}
	
	//rest of class
}
Code language: C# (cs)

原因 1 の例 – services.AddSingleton()

型を登録して、必要な具体的な型を伝え、その型にプリミティブ パラメーターがある場合、次のようになります。

public class Startup
{
	
	public void ConfigureServices(IServiceCollection services)
	{
		//rest of ConfigureServices()

		services.AddSingleton<ILogger, JsonLogger>();
	}

	//rest of Startup class
}
Code language: C# (cs)

次に、この例外が発生します:

プリミティブ コンストラクター パラメーターを解決する方法がわからないため、型の構築方法を指定する必要があります。

原因 2 の例 – services.AddSingleton

次のように、解決する具体的な型を明示的に指定せずに型を登録しようとすると:

public class Startup
{
	
	public void ConfigureServices(IServiceCollection services)
	{
		//rest of ConfigureServices()

		services.AddSingleton<ILogger>();
	}

	//rest of Startup class
}
Code language: C# (cs)

次に、次の例外が発生します:

原因 3 の例 – タイプを登録していない場合

ILogger に依存するコントローラーがあるとします。

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{


	private readonly ILogger _logger;

	public WeatherForecastController(ILogger logger)
	{
		_logger = logger;
	}
	
	//rest of class
}
Code language: C# (cs)

依存する型 (ILogger) を登録しないと、次の例外が発生します:

注:これは Microsoft.Extensions.Logging.ILogger ではありません。