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 中的依赖注入失败的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 依赖注入基本用法

ASP.NET Core中的依赖注入:控制反转(IoC)

如何解决 ASP.NET Core 中的依赖问题

抽象类中的依赖注入,ASP.NET Core

ASP.NET Core 2 中的依赖注入引发异常

ASP.Net Core 使用啥依赖注入框架?