我在StackOverflow上遵循了几种方法来解决我的问题,但没有一个结果:
我的DefaultConnection
字符串在我的AppSettings.json
中。要检索信息,我正在阅读以使用IConfiguration
中的startup.cs
。我的MsSQL上下文的构造函数仍在请求此IConfiguration。注意:我使用的是存储库模式。
startup.cs:
public Startup(IConfiguration configuration)
{
this.Configuration = configuration;
}
public IConfiguration Configuration { get; private set; }
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IConfiguration>(Configuration);
在提出建议后,我已在我的创业公司中添加了Singleton。不管有没有此方法,MsSQLContext的构造方法仍将其作为要传递的变量进行请求。离开构造函数就没有这个错误了:Connectionstring not initialized
。
AdminMsSQLContext:
private readonly string _connectionString;
public MSSQLAdminContext(IConfiguration configuration)
{
_connectionString = configuration.GetConnectionString("DefaultConnection");
}
答案 0 :(得分:1)
无论如何,注入IConfiguration
实际上是一种反模式。您应该做的是为作用域注册提供一个动作,并更改您的MSSQLAdminContext
类以仅接受其构造函数中的连接字符串:
public MSSQLAdminContext(string connectionString)
{
_connectionString = connectionString ?? throw new ArgumentNullException(nameof(connectionString));
}
然后:
services.AddScoped(_ =>
new MSSQLAdminContext(Configuration.GetConnectionString("DefaultConnection)));
您的存储库不应该了解类似您的配置的知识。如果需要连接字符串,则应使用连接字符串,仅此而已。
答案 1 :(得分:0)
我相信您遇到的问题是您尚未在DI容器中注册MSSQLAdminContext
。因此,DI引擎不知道将IConfiguration
注入到类中。在开始时,您将根据需要注册该类,我倾向于将作用域用于可能在多个地方使用的这些类型的类。像这样。
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<MSSQLAdminContext>();
services.AddSingleton<IConfiguration>(Configuration);
}