Конструктор .NET CORE 2.1 запрашивает IConfiguration - PullRequest
0 голосов
/ 29 октября 2018

Я использовал несколько методов в 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);

Я добавил синглтон в свой стартап после предложения. С этим или без него конструктор MsSQLContext все еще запрашивает это как переменную для передачи. Оставив конструктор без этого, я получаю ошибку: Connectionstring not initialized.

AdminMsSQLContext:

        private readonly string _connectionString;


    public MSSQLAdminContext(IConfiguration configuration)
    {
        _connectionString = configuration.GetConnectionString("DefaultConnection");
    }

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Инъекция IConfiguration на самом деле является анти-паттерном. Что вы должны сделать, это предоставить действие для регистрации вашей области и изменить класс MSSQLAdminContext так, чтобы он принимал только строку подключения в своем конструкторе:

public MSSQLAdminContext(string connectionString)
{
    _connectionString = connectionString ?? throw new ArgumentNullException(nameof(connectionString));
}

Тогда:

services.AddScoped(_ =>
    new MSSQLAdminContext(Configuration.GetConnectionString("DefaultConnection)));

В вашем репо не должно быть знаний о вашей конфигурации. Если ему нужна строка соединения, тогда она должна взять строку соединения, и это все.

0 голосов
/ 29 октября 2018

Я полагаю, что у вас проблема в том, что вы не зарегистрировали MSSQLAdminContext в контейнере DI. Из-за этого двигатель DI не знает, чтобы ввести IConfiguration в класс. При запуске вы зарегистрируете этот класс так, как вам нужно. Я обычно использую область видимости для этих типов классов, которые вы можете использовать в нескольких местах. Так что-то вроде этого.

public void ConfigureServices(IServiceCollection services)
        {
            services.AddScoped<MSSQLAdminContext>();
            services.AddSingleton<IConfiguration>(Configuration);
        }
...