.NET CORE 2.1构造函数要求IConfiguration

时间:2018-10-29 15:30:47

标签: asp.net dependency-injection .net-core repository-pattern asp.net-core-2.1

我在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");
    }

2 个答案:

答案 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);
        }