web-dev-qa-db-ja.com

.Netコアコンソールアプリケーションで依存性注入を使用する方法

コンソールアプリケーションを使用してデータベースにデータを追加する必要があります。追加したMain()メソッドで:

var services = new ServiceCollection();
var serviceProvider = services.BuildServiceProvider();
var connection = @"Server = (localdb)\mssqllocaldb; Database = CryptoCurrency; Trusted_Connection = True; ConnectRetryCount = 0";
services.AddDbContext<CurrencyDbContext>(options => options.UseSqlServer(connection));

別のクラスでは、データベースを操作する機能を追加し、それをWeb APIアプリケーションのようにして、DbContextをコンストラクターに追加しました。

public AutoGetCurrency(CurrencyDbContext db) =>  this.db = new CurrencyDbContext();

これにより、次のエラーが発生します。

オブジェクト参照がオブジェクトインスタンスに設定されていません

パラメータなしでデフォルトのコンストラクタを追加しようとしましたが、それでも同じエラーが発生します。

.NetコアコンソールアプリケーションでDIを使用する方法を教えてください。

7
Matz Heri

プロバイダーを構築する前にコレクションにサービスを追加します。あなたの例では、すでにプロバイダーを構築した後でサービスを追加しています。コレクションに加えられた変更は、いったん構築されるとプロバイダーに影響を与えません。

var services = new ServiceCollection();
var connection = @"Server = (localdb)\mssqllocaldb; Database = CryptoCurrency; Trusted_Connection = True; ConnectRetryCount = 0";
services.AddDbContext<CurrencyDbContext>(options => options.UseSqlServer(connection));
//...add any other services needed
services.AddTransient<AutoGetCurrency>();

//...

////then build provider 
var serviceProvider = services.BuildServiceProvider();

また、コンストラクターの例では、まだdbを初期化しています。

public AutoGetCurrency(CurrencyDbContext db) =>  this.db = new CurrencyDbContext();

挿入されたdbは使用されていません。注入された値をローカルフィールドに渡す必要があります。

public AutoGetCurrency(CurrencyDbContext db) =>  this.db = db;

正しく構成されたら、プロバイダーを介してクラスを解決し、プロバイダーに、要求されたサービスを解決するときに必要な依存関係を作成して挿入させることができます。

var currency = serviceProvider.GetService<AutoGetCurrency>();
12
Nkosi