ASP.NET Core RC2 中的依赖注入失败
Posted
技术标签:
【中文标题】ASP.NET Core RC2 中的依赖注入失败【英文标题】:Dependency injection failure in ASP.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 方法中访问该属性 【参考方案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 核心应用程序损坏而没有警告,只是运行时失败。以上是关于ASP.NET Core RC2 中的依赖注入失败的主要内容,如果未能解决你的问题,请参考以下文章