0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

.NET 開発においてSystem.InvalidOperationException

Last updated at Posted at 2024-11-20

1. System.InvalidOperationException の発生

WPF アプリケーションで Microsoft.Extensions.DependencyInjection を利用している場合、例外 System.InvalidOperationException がスローされるケースがあります。このエラーは、通常、DI コンテナの設定や依存性の解決に問題がある場合に発生します。

発生するエラーメッセージ:

例外がスローされました: 'System.InvalidOperationException' (Microsoft.Extensions.DependencyInjection.dll の中)

原因:

このエラーの主な原因は、DI コンテナが期待している型がコンストラクタで解決されない場合です。例えば、以下のように引数を持つコンストラクタがある場合、DI コンテナが適切な依存性を提供できなければ例外が発生します。

2. xaml.cs でのコンストラクタに引数が渡されなかったケース

特定のウィンドウやコントロールで、コンストラクタに引数を持つ形で定義している場合、App.xamlStartupUri を使用して起動した際に、引数が渡されず例外が発生します。

コード例:

public partial class MainWindow : Window
{
    private readonly SomeService _service;

    public MainWindow(SomeService service)
    {
        _service = service;
        InitializeComponent();
    }
}

この場合、App.xamlStartupUri で直接 MainWindow を指定すると、DI コンテナが SomeService の依存性を解決できず例外が発生します。

解決方法:

  1. DI コンテナを通じた解決
    DI コンテナを利用してウィンドウを起動する場合、App.xamlStartupUri を使用せず、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);
        }
    }
    
  2. 引数なしのコンストラクタを追加する
    DI を使用せず、単純なアプリケーションの場合は、引数なしのコンストラクタを追加することでエラーを回避できます。

    public MainWindow() : this(new SomeService())
    {
    }
    

まとめ

  • System.InvalidOperationException は、DI コンテナが適切に設定されていない場合に発生する可能性があります。
  • App.xamlStartupUri で起動するウィンドウは、引数なしのコンストラクタを持つ必要があります。
  • 依存性注入を使用する場合は、App.xaml.cs で明示的に起動するようにしましょう。
0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?