Разрешить зависимость через файл xml или web.config с помощью lightinject

При использовании lightinject есть ли способ использовать строковое значение из внешнего файла конфигурации, чтобы указать контейнеру зарегистрировать службу, как указано в файле? Это будет файл xml или файл web.config.

Например, в предыдущем проекте в моем web.config у меня была бы следующая строка

 <add key="PersonRepository.Interface.IPersonRepository" value="PersonRepository.Db.DbRepository,
     PersonRepository.Db, Version=1.0.0.0, Culture=neutral"/>

Я мог бы получить значение через вызов WebConfigurationManager. Этот пример получает конкретное имя класса PersonRepository.Db.DbRepository в виде строки, которую затем можно использовать для разрешения зависимости. Это метод, который я использовал в прошлом, но не могу понять, как сделать то же самое с lightinject. Это возможно?

Извините, если это немного запутанно, это мой первый правильный набег на внедрение зависимостей.

Большое спасибо.


И снова здравствуйте. Я пытался пару дней реализовать метод, как вы описали, и это не сработало. Чтобы продемонстрировать это кратко;

 var myString = "hello";
 Type stringType = Type.GetType(myString);
 container.Register<ICloneable, stringType>();

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

После дальнейшего чтения здесь;

Как использовать typeof или GetType() в качестве универсального шаблона?

Кажется, это ограничение языка. Есть какие-нибудь мысли, пожалуйста? Большое спасибо.


person Aeptitude    schedule 03.10.2016    source источник


Ответы (1)


LightInject не работает напрямую с файлами XML, но вы должны иметь возможность получить доступ к обоим типам, типу службы и типу реализации через диспетчер конфигурации. Затем вам нужно будет разрешить типы, используя что-то вроде Type.GetType(typeName), а затем зарегистрировать службу в контейнере.

При этом я настоятельно рекомендую вам перенести конфигурацию контейнера из файла конфигурации в код (корень композиции). Сопоставление между типами службы и реализации редко меняется после компиляции, и вы получаете преимущество строго типизированной конфигурации.

person seesharper    schedule 04.10.2016
comment
И снова здравствуйте. Я пытался пару дней реализовать метод, как вы описали, и это не сработало. Чтобы продемонстрировать это кратко; вар myString = привет; Тип stringType = Type.GetType(myString); container.Register‹ICloneable, stringType›(); Я получаю сообщение об ошибке от компилятора 'stringType' является переменной, но используется как тип. После дальнейшего чтения здесь; stackoverflow .com/questions/302577/ Кажется, это ограничение языка. Есть какие-нибудь мысли, пожалуйста? Большое спасибо - person Aeptitude; 06.10.2016
comment
Почему бы нам не продолжить это на GitHub? Создайте задачу в репозитории LightInject. Затем создайте еще одно репо с образцом того, что вы пытаетесь сделать, и мы пропиаримся в этом репо. - person seesharper; 07.10.2016
comment
Вот ссылка на это PR, поскольку без него этот ответ обманчиво бесполезен. - person LinuxDisciple; 12.07.2019