You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 8 Blazor Server获取连接字符串报错:找不到合适构造函数

问题描述

尝试多种方法均无法从appsettings.json中获取连接字符串,当前方案运行时抛出以下错误,求可行解决方案:

System.InvalidOperationException: A suitable constructor for type 'App.Services.DataService' could not be located. Ensure the type is concrete and all parameters of a public constructor are either registered as services or passed as arguments. Also ensure no extraneous arguments are provided.

现有代码

appsettings.json

{
    "ConnectionStrings": {
        "Database1": "Server=_____.____.____;Database=______;Trusted_Connection=True;MultipleActiveResultSets=true;"
    }
}

Program.cs

builder.Services.Configure<ConnectionStrings>
              (builder.Configuration.GetSection("ConnectionStrings"));
builder.Services.AddSingleton<IDataService, DataService>();

ConnectionStrings.cs

public class ConnectionStrings
{
    public string Database1 { get; set; }
}

DataService.cs

public class DataService : IDataService
{
    private readonly ConnectionStrings _connectionStrings;

    public DataService(IOptions<ConnectionStrings> connectionStrings)
    {
        _connectionStrings = connectionStrings.Value;
    }
}

Page.razor

@inject IDataService DataService 

...

_elements = await DataService.GetElementsByTerm(term);
...

可行解决方案

方案一:修复当前IOptions注入逻辑

现有代码逻辑本身是正确的,报错大概率是以下细节问题导致:

  • 确认ConnectionStrings类所在的命名空间已被Program.cs引用
  • 确认IDataService是public接口,且DataService完整实现了该接口的所有成员
  • 检查ConnectionStrings类的属性名Database1与appsettings.json中的键名完全一致(大小写敏感)

如果以上都没问题,重新清理解决方案并重新生成,即可正常注入。

方案二:直接注入ConnectionStrings实例(简化版)

无需通过IOptions包装,直接将配置实例注册为服务:

  1. 修改Program.cs:
// 读取配置并转为ConnectionStrings实例
var connectionStrings = builder.Configuration.GetSection("ConnectionStrings").Get<ConnectionStrings>();
// 注册为单例服务
builder.Services.AddSingleton(connectionStrings);
// 保持DataService的注册不变
builder.Services.AddSingleton<IDataService, DataService>();
  1. 修改DataService.cs的构造函数,直接注入ConnectionStrings:
public class DataService : IDataService
{
    private readonly ConnectionStrings _connectionStrings;

    public DataService(ConnectionStrings connectionStrings)
    {
        _connectionStrings = connectionStrings;
    }
}

方案三:直接注入单个连接字符串(更轻量化)

如果只需要Database1这一个连接字符串,可以直接注册字符串:

  1. 修改Program.cs:
var dbConnStr = builder.Configuration.GetConnectionString("Database1");
builder.Services.AddSingleton(dbConnStr);
builder.Services.AddSingleton<IDataService, DataService>();
  1. 修改DataService.cs:
public class DataService : IDataService
{
    private readonly string _dbConnectionString;

    public DataService(string dbConnectionString)
    {
        _dbConnectionString = dbConnectionString;
    }
}

内容的提问来源于stack exchange,提问作者Jim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 11:06:12