如何在.Net core 2.0控制台应用程序中使用依赖注入

时间:2018-01-21 17:47:09

标签: c# dependency-injection .net-core console-application

我必须使用控制台应用程序将数据添加到我的数据库。在Main()方法中,我添加了:

System.Data.Entity.DbContext

在另一个类中,我添加了使用数据库的功能,并使其像Web Api应用程序一样,并将我的DbContext添加到构造函数中:

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

这会出现以下错误:

  

对象引用未设置为对象的实例

我尝试添加一个没有参数的默认构造函数,但仍然会出现相同的错误。

请告诉我如何在.Net核心控制台应用程序中使用DI?

1 个答案:

答案 0 :(得分:10)

在构建提供程序之前将服务添加到集合。在您的示例中,您在构建提供程序后添加服务。一旦构建,对集合所做的任何修改都不会对提供者产生影响。

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

未使用注入的数据库。您需要将注入的值传递给本地字段。

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

一旦配置正确,您就可以通过提供程序解析您的类,并让提供程序在解析所请求的服务时创建并注入任何必要的依赖项。

var currency = serviceProvider.GetService<AutoGetCurrency>();
相关问题