【问题标题】:Dependency injection failure in ASP.NET Core RC2ASP.NET Core RC2 中的依赖注入失败
【发布时间】:2016-06-15 18:10:59
【问题描述】:

在尝试将我的 asp.net 核心应用程序从 1.0 RC1 移植到 1.0 RC2 后,我无法启动它。我得到的启动错误是这样的:

Unhandled Exception: System.Exception: Could not resolve a service of type 'Microsoft.Extensions.Configuration.IConfiguration' for the parameter 'configuration' of method 'Configure' on type 'MYCOMPANY.MYTHING.Api.Startup'.
   at Microsoft.AspNetCore.Hosting.Startup.ConfigureBuilder.Invoke(Object instance, IApplicationBuilder builder)
   at Microsoft.AspNetCore.Hosting.Internal.WebHost.BuildApplication()
   at Microsoft.AspNetCore.Hosting.WebHostBuilder.Build()
   at MYCOMPANY.MYTHING.Api.Program.Main(String[] args)

我不知道这应该如何工作。

我理解的部分是:

  • 我的 startup.cs 代码对我来说看起来是正确的,在 Startup(IHostingEnvironment env) 中,我创建了一个 ConfigurationBuilder 并将 Startup.Configuration 设置为等于 builder.Build()。也到达了 ConfigureServices 方法,并且在那里存在 Configuration 对象。

  • 在 Program.cs 中到达 host.Run() 代码时,我遇到了崩溃。

  • 永远无法达到Configure(app,env,loggerFactory,configuration,respository...) 方法。

  • 在 RC1 中曾经有这样一行:

    services.AddInstance<IConfiguration>(Configuration);
    
  • 在新应用程序中不再存在的 RC2 中(我正在阅读一个可以运行的新应用程序并尝试逐行比较)。

我一直在寻找如何使这项工作,以及如何理解 IConfigurationRoot 的依赖注入,但我没有看到任何似乎对这种注入负责的属性或代码。

更新:似乎我在 RC1 代码中使用了一些 RC2 不再支持的奇怪模式。在我从 Configure() 方法中删除一些附加参数后,.net 核心启动代码再次调用它。

【问题讨论】:

  • 我想看看你的 Startup 的 Configure 方法,注意 services.AddInstance 更改为 .AddSingleton for rc2,但是你不需要将 IConfiguration 注入到 Configure 方法中,它应该被持久化作为 Startup 构造函数中的属性,则可以在 Configure 方法中访问该属性

标签: c# dependency-injection asp.net-core


【解决方案1】:

看起来你已经解决了这个问题,但是关于配置方法的限制并不像你建议的那么严格和快速。

限制是您必须有一个名为 ConfigureDevelopment 的公共、实例或静态方法,其中 Development 是环境名称,或者一个名为 Configure 的方法,如果环境具体的配置方法不存在。

显然,您不需要将 IConfiguration 注入到 Configure 方法中,因为它将在您的 Startup 类中设置,但如果您需要注入其他东西(并且您已经在ConfigureServices 那么你可以这样做。例如,以下将是完全有效的。

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<ISuperSecretClass, SuperSecretClass>();
}

public void Configure(IApplicationBuilder app, ISuperSecretClass instance)
{
   //do something with instance
}

作为参考,我在the StartupLoader source 中检查了Configure 的限制。

【讨论】:

  • 我确实有一个,但它有额外的“ISomething”参数,这似乎阻止了asp.net核心找到和调用它。这个答案很好,因为我不知道“ConfigureDevelopment”。
【解决方案2】:

如果你想注入Configuration 实例,你可以这样做:

services.AddSingleton((provider)=>
{
     return Configuration;
});

【讨论】:

  • 通常这不是必需的。我认为问题在于您可以构建和编译一个 Startup.Configure() 方法,该方法由于无效签名而永远不会被调用,这会导致 .net 核心应用程序损坏而没有警告,只是运行时失败。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-21
  • 2018-01-16
  • 2019-02-22
  • 1970-01-01
  • 1970-01-01
  • 2017-09-10
相关资源
最近更新 更多