Как обновить зарегистрированный тип данными из файла XML, который вы загрузите позже? - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть устаревшее 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 файла.

Спасибо!

...