web-dev-qa-db-fra.com

Comment utiliser l'injection de dépendances dans l'application console .Net core 2.0

Je dois ajouter des données à ma base de données à l'aide d'une application console. Dans la méthode Main (), j'ai ajouté:

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));

Dans une autre classe, j'ajoute des fonctionnalités pour travailler avec la base de données, je l'ai fait comme une application Web Api et j'ai ajouté mon DbContext dans le constructeur:

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

Cela donne l'erreur suivante:

La référence d'objet n'est pas définie à une instance d'un objet

J'ai essayé d'ajouter un constructeur par défaut sans paramètres, et cela donne toujours la même erreur.

Veuillez me dire comment je peux utiliser DI dans l'application console de base .Net?

7
Matz Heri

Ajoutez des services à la collection avant de créer le fournisseur. Dans votre exemple, vous ajoutez des services après avoir déjà créé le fournisseur. Toute modification apportée à la collection n'a aucun effet sur le fournisseur une fois créé.

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();

Toujours dans l'exemple du constructeur, à condition que vous initialisiez toujours la base de données.

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

La base de données injectée n'est pas utilisée. Vous devez transmettre la valeur injectée au champ local.

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

Une fois configuré correctement, vous pouvez ensuite résoudre vos classes via le fournisseur et demander au fournisseur de créer et d'injecter toutes les dépendances nécessaires lors de la résolution du service demandé.

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