1. System.InvalidOperationException
の発生
WPF アプリケーションで Microsoft.Extensions.DependencyInjection
を利用している場合、例外 System.InvalidOperationException
がスローされるケースがあります。このエラーは、通常、DI コンテナの設定や依存性の解決に問題がある場合に発生します。
発生するエラーメッセージ:
例外がスローされました: 'System.InvalidOperationException' (Microsoft.Extensions.DependencyInjection.dll の中)
原因:
このエラーの主な原因は、DI コンテナが期待している型がコンストラクタで解決されない場合です。例えば、以下のように引数を持つコンストラクタがある場合、DI コンテナが適切な依存性を提供できなければ例外が発生します。
2. xaml.cs
でのコンストラクタに引数が渡されなかったケース
特定のウィンドウやコントロールで、コンストラクタに引数を持つ形で定義している場合、App.xaml
の StartupUri
を使用して起動した際に、引数が渡されず例外が発生します。
コード例:
public partial class MainWindow : Window
{
private readonly SomeService _service;
public MainWindow(SomeService service)
{
_service = service;
InitializeComponent();
}
}
この場合、App.xaml
の StartupUri
で直接 MainWindow
を指定すると、DI コンテナが SomeService
の依存性を解決できず例外が発生します。
解決方法:
-
DI コンテナを通じた解決
DI コンテナを利用してウィンドウを起動する場合、App.xaml
のStartupUri
を使用せず、App.xaml.cs
で以下のように明示的にウィンドウを起動します。public partial class App : Application { private readonly IServiceProvider _serviceProvider; public App() { var services = new ServiceCollection(); services.AddSingleton<SomeService>(); services.AddTransient<MainWindow>(); _serviceProvider = services.BuildServiceProvider(); } protected override void OnStartup(StartupEventArgs e) { var mainWindow = _serviceProvider.GetRequiredService<MainWindow>(); mainWindow.Show(); base.OnStartup(e); } }
-
引数なしのコンストラクタを追加する
DI を使用せず、単純なアプリケーションの場合は、引数なしのコンストラクタを追加することでエラーを回避できます。public MainWindow() : this(new SomeService()) { }
まとめ
-
System.InvalidOperationException
は、DI コンテナが適切に設定されていない場合に発生する可能性があります。 -
App.xaml
のStartupUri
で起動するウィンドウは、引数なしのコンストラクタを持つ必要があります。 - 依存性注入を使用する場合は、
App.xaml.cs
で明示的に起動するようにしましょう。