Регистрация типа 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:
- ваш класс имеет два конструктора и
- если удалить конструктор по умолчанию, примитивные типы, такие как строки могут быть добавлены.
Немесв почти прав в своем комментарии. Вы можете вернуться к использованию регистрации делегата следующим образом:
container.Register<IDAL>(() => new DAL("db"));
в этой статье описывает, почему ваши компоненты приложения должны иметь только один конструктор.
если конструктор ищет строковое значение контейнер.Register (() = > new DAL ("db"));
если конструктор ищет другой класс
container.Register<IDAL>(() => new DAL(new class()));