尝试从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核心启动代码调用。
答案 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;
});