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

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

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

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 типа String, который нельзя использовать для внедрения конструктора.

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

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

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


comment
Вы можете написать что-то вроде container.Register<IDAL, DAL>(() => new Dal("databaseInstance"));   -  person nemesv    schedule 03.01.2014
comment
Привет, спасибо за ответ, но я получаю сообщение об ошибке, в котором говорится, что нельзя преобразовать лямбда-выражение в тип SimpleInjector.Lifestyle, потому что это не тип делегата.   -  person sksallaj    schedule 03.01.2014
comment
Привет, изменил код ... и я кое-что получил: container.Register ‹IDAL› (() = ›new Dal (databaseInstance)); Благодарность! Я буду держать это открытым, пока не убедится, что все работает нормально.   -  person sksallaj    schedule 03.01.2014


Ответы (2)


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

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

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

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

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

person Steven    schedule 03.01.2014
comment
Если вы это сделаете, пожалуйста, как / где вы укажете стиль жизни? - person Caltor; 28.03.2017
comment
@Caltor: вы читали документацию? - person Steven; 28.03.2017
comment
Ближайший пример, который я могу найти, - container.Register<IService>(() => new RealService(new SqlRepository()), Lifestyle.Transient);, но что, если я не хочу указывать new SqlRepository(), тогда он станет container.Register<IService>(() => new RealService(), Lifestyle.Transient);? - person Caltor; 29.03.2017

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

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

container.Register<IDAL>(() => new DAL(new class()));
person priyanka    schedule 28.07.2017