【问题标题】:How to use Dependency Injection in .Net core Console Application如何在 .Net 核心控制台应用程序中使用依赖注入
【发布时间】:2018-06-30 09:23:37
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 谢谢你的回答,请告诉我,我有带参数的构造函数,我需要在Main()中创建这个类的实例,var currency = new AutoGetCurrency(/*我要写什么这里*/); ???
    • @UladzimirKhadakouski 您还可以使用服务集合注册该类,并让提供者创建并注入任何必要的依赖项。
    • 我还是不明白。如果我只需要 main 中的 dbcontext 怎么办?
    • @tnk479 没有什么能阻止您自己初始化所有内容。但是,当有可以完成大部分繁重工作的服务/容器时,这需要做很多事情。
    • 但是当数据库发生变化时,例如插入新记录,数据库没有得到最新的变化,我每次都必须重复serviceProvider = services.BuildServiceProvider();。 :(((((
    【解决方案2】:

    https://github.com/Akeraiotitasoft/ConsoleDriving Nuget:Akeraiotitasoft.ConsoleDriving 这个 API 是测试版。如果有人认为它工作正常,请发送电子邮件。 将发布。

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    • 2019-09-26
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 2018-05-14
    相关资源
    最近更新 更多