【问题标题】:System.ArgumentNullException: Value cannot be null, Parameter name: implementationInstanceSystem.ArgumentNullException:值不能为空,参数名称: implementationInstance
【发布时间】:2018-06-03 15:54:21
【问题描述】:

我在 IIS 中部署了 .NET core mvc 应用程序,当我运行应用程序时,页面显示 502.5 错误,我在 powershell "dotnet D:\deploy\WebApp\WebApp.dll" 中运行命令,以下显示详细错误内容:

注意:.net 核心版本 2.0.0

未处理的异常:System.ArgumentNullException:值不能为空。 参数名称: implementationInstance 在 Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions .AddSingleton[TService](IServiceCollection services, TService implementationInstance)

我知道错误是怎么发生的,如何实例化?

public class Startup
{   ...
    public void ConfigureServices(IServiceCollection services)
    {
        ...
        services.AddSingleton(CreateQuery());  // this is error location
        ...
    }

    IQuery CreateQuery()
    {
        IQuery query = null;
        var dataBase = Configuration.GetSection("AppSettings")["DataBase"];
        var defaultConnection = Configuration.GetSection("ConnectionStrings")["SqlServer"];
        switch (dataBase)
        {
            case "sqlserver":
                query = new WebApp.Query.Query(defaultConnection);
                break;
        }
        return query;
    }
}

【问题讨论】:

  • 你在使用之前实例化了 implementationInstance 吗?
  • 已经实例化了,但这可能行不通
  • 在 implementationInstance 之前移除 TService..
  • 我不知道。 net core怎么新建一个实例注入,可能不行,我改了平时的依赖注入,现在程序可以运行了,谢谢大家的帮助
  • @Lin.Hao 请更新解决方案

标签: c# iis asp.net-core


【解决方案1】:

如果有人来寻找可能的解决方案,我可以通过使用.AddSingleton 提供的IServiceProvider 回调以下列方式获取配置,从而在 .NET Core 3.1 项目中解决此问题:

public class Startup
{   ...
    public void ConfigureServices(IServiceCollection services)
    {
        ...
        // Pass the service provider that AddSingleton provides
        services.AddSingleton((serviceProvider) => {
            CreateQuery(serviceProvider)
        });
        ...
    }

    IQuery CreateQuery(IServiceProvider serviceProvider)
    {
        IQuery query = null;

        // Use the service provider to get the configuration
        var configuration = serviceProvider.GetRequiredService<IConfiguration>();

        var dataBase = configuration.GetSection("AppSettings")["DataBase"];
        var defaultConnection = configuration.GetSection("ConnectionStrings")["SqlServer"];
        switch (dataBase)
        {
            case "sqlserver":
                query = new WebApp.Query.Query(defaultConnection);
                break;
        }
        return query;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-17
    • 2010-11-11
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    相关资源
    最近更新 更多