c# - 如何在 .Net 核心控制台应用程序中使用依赖注入(inject)

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

我必须使用控制台应用程序将数据添加到我的数据库中。在我添加的 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();

这会产生以下错误:

Object reference not set to an instance of an object

我尝试添加一个不带参数的默认构造函数,它仍然给出同样的错误。

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

最佳答案

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

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

同样在构造函数示例中,前提是您仍在初始化数据库。

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

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

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

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

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

关于c# - 如何在 .Net 核心控制台应用程序中使用依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48369845/

相关文章:

c# - 使用 OpenAPI 操作过滤器向需要身份验证的 Controller 端点添加安全要求

c# - 使用 async/await 时处理节流/速率限制(429 错误)

c# - 任务并行库 - 阻塞操作?

c# - 从 web 服务返回列表<object>

wpf - 从 View 加载新项目时注入(inject)新的依赖项集

c# - 使用静态记录器、静态帮助程序类进行依赖注入(inject)

c# - 为什么我看到 .Cast<int>() 和 .Select(a => (int)a) 之间存在差异?

c# - Windows 8 中的某些窗口阻止我的低级键盘 Hook 工作

java - 什么是依赖注入(inject)?

c# - 如何配置 .netcore 代理连接到 webpack 以使用 HTTP 而不是 HTTPS