Регистрация типа c несколькими конструкторами и Строковой зависимостью в простом инжекторе

Я пытаюсь понять, как использовать простой инжектор, я использовал его вокруг проекта без проблем с регистрацией простых сервисов и их компонентов.

однако я хотел использовать инжектор зависимостей при наличии компонента с более чем двумя конструкторами, реализующими интерфейс.

public DAL: IDAL
{
    private Logger logger;
    string _dbInstance;
    public DAL()
    {
        logger = new Logger();
    }

    public DAL(string databaseInstance)
    {
         logger = new Logger();
         _dbInstance = databaseInstance;
    }
}

вот как я регистрирую услуги:

container.Register<IDAL, DAL>();

запуск кода, это ошибка, которая происходит:

для контейнер, чтобы иметь возможность создавать DAL, он должен содержать точно один открытый конструктор, но он имеет 2.

после удаления конструктора следующая ошибка заключается в том, что он не позволяет моему конструктору принимать параметр.

конструктор типа DAL содержит параметр 'databaseInstance' из введите строку, которая не может использоваться для инъекции конструктора.

есть ли способ, где я могу сделать инъекцию зависимостей, где класс более 2 открытых конструкторов? Или иметь один открытый конструктор, который принимает параметр?

Я читаю документацию здесь:SimpleInjector (Начало Работы)

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

2 ответов


в вашем классе есть две вещи, которые не позволяют простому инжектору автоматически подключать ваш класс DAL:

  1. ваш класс имеет два конструктора и
  2. если удалить конструктор по умолчанию, примитивные типы, такие как строки могут быть добавлены.

Немесв почти прав в своем комментарии. Вы можете вернуться к использованию регистрации делегата следующим образом:

container.Register<IDAL>(() => new DAL("db"));

в этой статье описывает, почему ваши компоненты приложения должны иметь только один конструктор.


если конструктор ищет строковое значение контейнер.Register (() = > new DAL ("db"));

если конструктор ищет другой класс

container.Register<IDAL>(() => new DAL(new class()));