ASP.NET Core RC2中的依赖注入失败

时间:2016-06-15 18:11:00

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

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

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()代码时,我遇到了崩溃。

  • 从未达到配置(app,env,loggerFactory,配置,存储库......)方法。

  • 在RC1中曾经是这样的一行:

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

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

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

2 个答案:

答案 0 :(得分:3)

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

限制是你必须有一个名为ConfigureDevelopment的公共,实例或静态方法,其中开发是环境名称,或者名为Configure的方法,它将是如果不存在特定于环境的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限制。

答案 1 :(得分:2)

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

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