У меня есть устаревшее C#. NET приложение Win32, в которое я медленно добавлял внедрение зависимостей (через контейнер Unity), чтобы я мог добавлять к нему все больше и больше модульных тестов.
В последнее время я работал с некоторыми библиотеками, которые фактически являются Клиентами API / они выполняют различные HTTP-запросы к определенному набору микросервисов, которые выполняют операции CRUD в базе данных. Я бы настроил каждую библиотеку в Unity и использовал InjectionConstructors для передачи ссылок на такие настраиваемые строковые значения, как фактический URL, на который мы собираемся.
Пример:
container.RegisterType<IContactReadService, RAPIDContactReadService>(new InjectionConstructor(container.Resolve<IManageHTTP>(), typeof(string)));
(Как только контейнер сконфигурирован, мы создаем новую фабрику обслуживания и затем передаем эту фабрику в Main.)
Теперь это приложение имеет его конфигурация в пользовательском XML конфигурационном файле, который является общим для сетевого диска. Итак, прошло довольно много секунд ПОСЛЕ того, как мы зарегистрировали контейнер, который на самом деле прочитали XML, загрузили значение URL, а затем вот как я фактически устанавливал значение строки URL в программе Main:
contactReadService = serviceFactory.GetContactReadService(httpService, Config.RAPIDContactReadServiceURL);
Это работало нормально в течение некоторого времени. Мне удалось создать экземпляры Mock этих библиотек для использования в модульных тестах. Но теперь я хочу иметь возможность добавлять некоторые модульные тесты в эти библиотеки сами ... (вот почему вы видите, что теперь у меня есть библиотека HTTP, которую они используют, вводимая).
Одна вещь, которую я до сих пор не абстрагировал от этих библиотек, это их зависимость от службы авторизации OAuth. У меня есть один отдельный класс для этого, который я хотел бы теперь использовать Unity для добавления зависимостей:
container.RegisterType<IContactReadService, RAPIDContactReadService>(new InjectionConstructor(container.Resolve<IManageHTTP>(), container.Resolve<IAuthService>, typeof(string)));
Проблема в том, что это не будет работать, если я попытаюсь зарегистрировать службу аутентификации как Тип, который также использует конструктор Injection, чтобы иметь дело со строками для передачи таких вещей, как URL-адрес службы, ключ OAuth и секрет OAuth (все из которых хранятся в этом общем файле конфигурации XML):
container.RegisterType<ITicketingSystemAuthService, RAPIDAuthorizationService>(new InjectionConstructor(container.Resolve<IManageHTTP>(), typeof(string), typeof(string), typeof(string)));
Похоже, мне нужны эти данные "заранее". И я вижу, что есть способы сделать это из файла конфигурации приложения XML установки программы, но мы не вправе использовать это, в данном случае.
Я не уверен, что действительный Обходной путь: создать второй конструктор (пустой) для моей библиотеки службы аутентификации, зарегистрировать его, используя взамен RegisterInstance ... и затем ... хорошо ... если бы был какой-то способ, которым я мог бы ОБНОВИТЬ эту регистрацию позже в моем Основной код, чтобы передать эти строки?
Не знаю. Я не уверен, что делать здесь. Я не могу изменить нашу стратегию хранения / загрузки строковых данных из этого XML файла.
Спасибо!