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包装,直接将配置实例注册为服务:
- 修改
Program.cs:
// 读取配置并转为ConnectionStrings实例 var connectionStrings = builder.Configuration.GetSection("ConnectionStrings").Get<ConnectionStrings>(); // 注册为单例服务 builder.Services.AddSingleton(connectionStrings); // 保持DataService的注册不变 builder.Services.AddSingleton<IDataService, DataService>();
- 修改
DataService.cs的构造函数,直接注入ConnectionStrings:
public class DataService : IDataService { private readonly ConnectionStrings _connectionStrings; public DataService(ConnectionStrings connectionStrings) { _connectionStrings = connectionStrings; } }
方案三:直接注入单个连接字符串(更轻量化)
如果只需要Database1这一个连接字符串,可以直接注册字符串:
- 修改
Program.cs:
var dbConnStr = builder.Configuration.GetConnectionString("Database1"); builder.Services.AddSingleton(dbConnStr); builder.Services.AddSingleton<IDataService, DataService>();
- 修改
DataService.cs:
public class DataService : IDataService { private readonly string _dbConnectionString; public DataService(string dbConnectionString) { _dbConnectionString = dbConnectionString; } }
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

