关于c#:ASP.NET Core RC2中的依赖注入失败

Dependency injection failure in ASP.NET Core RC2

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

1
2
3
4
5
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(ihostingvironment env)中,我创建了一个configuration builder,并将startup.configuration设置为builder.build()。也达到了configureServices方法,并且存在配置对象。

  • 当在program.cs中到达host.run()代码时,我会崩溃。

  • 配置(app,env,loggerfactory,configuration,resposiory…)方法从未达到。

  • 在RC1中,曾经有这样一条线:

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

我一直在寻找如何实现这一点,以及如何理解IConfigurationRoot的依赖项注入,但是我没有看到任何属性或代码似乎是导致这一注入的原因。

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


看起来您已经解决了这个问题,但是对于配置方法的限制并不像您建议的那样困难和快速。

限制是必须有一个名为ConfigureDevelopment的公共、实例或静态方法,其中development是环境名称,或者一个名为Configure的方法,如果不存在特定于环境的配置方法,则将使用该方法。

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

1
2
3
4
5
6
7
8
9
public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<ISuperSecretClass, SuperSecretClass>();
}

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

作为参考,我检查了Startuploader源中的Configure限制。


如果要注入Configuration实例,可以执行以下操作:

1
2
3
4
services.AddSingleton((provider)=>
{
     return Configuration;
});