DI и базовый класс - PullRequest
       15

DI и базовый класс

0 голосов
/ 13 марта 2019

Я создал простое asp.net core приложение на типичном примере, и оно работает как положено.Затем я добавил поддержку конфигурации через appsettings.json следующим образом:

[ApiController]
[Route("[controller]/[action]")]
public class MyController: BaseController
{
private IConfiguration _configuration = null;
public MyController(IConfiguration configuration)
        {
            _configuration = configuration;
        }
//some actions here
}

, и это тоже сработало.Но теперь я хотел иметь реализацию Configuration в своем базовом классе (BaseController), чтобы все производные контроллеры имели к нему доступ.
Ничего сложного, подумал я и переписал это:
public class

[ApiController]
[Route("[controller]/[action]")]
public class MyController: BaseController
{
//some actions here
}

public class BaseController: ControllerBase
{
        private IConfiguration _configuration = null;
        public IConfiguration Configuration
        {
            get
            {
                return _configuration;
            }
        }

        public BaseController(IConfiguration configuration = null)
        {
            _configuration = configuration;
        }
}

и хотя этот код успешно компилируется со значением параметра по умолчанию в конструкторе базового класса, Configuration всегда null.

Что я делаю неправильно, и может ли он сейчассделать эту работу в чистом виде?

Ответы [ 2 ]

2 голосов
/ 13 марта 2019

Вам необходимо передать параметр IConfiguration из конструктора подкласса в конструктор базового класса.

Пример:

public abstract class BaseClass
{
    protected IConfiguration _configuration;

    public BaseClass(IConfiguration configuration)
    {
        _configuration = configuration;
    }
}

Обратите внимание, что переменная экземпляра IConfiguration базового класса должна быть защищена, если вы хотите иметь доступ к ней из подкласса.

public class SubClass : BaseClass
{
    public SubClass(IConfiguration configuration) : base(configuration) { }
}

Добавляя base(configuration), вы вызываете конструктор базового класса и передаете ему параметр configuration.

0 голосов
/ 13 марта 2019

Прежде всего.Отметьте свой базовый класс abstract конструктором protected.Используйте ключевое слово base из вашего дочернего класса, чтобы создать частное поле IConfiguration в базовом классе.

   public class MyController(IConfiguration configuration) : base(configuration) {}

    public abstract class BaseClass
    {
       protected BaseClass(IConfiguration configuration) { _configuration = configuration; }
    }
...