Unity ServiceLocator, регистр типов во время выполнения - PullRequest
1 голос
/ 02 сентября 2010

У меня есть небольшой инструментарий, который использует Unity DI плюс EntLib Service Locator. Проблема возникает, когда сторонние приложения пытаются использовать локатор службы EntLib. Похоже, что EntLib Service Locator является одиночным, поэтому, когда стороннее приложение загружает свой сервисный локатор, оно стирает конфигурацию моего сервисного локатора. Клиент создает сервисный локатор следующим образом:

        container = new UnityContainer();
        locator = new UnityServiceLocator(Initialize());
        ServiceLocator.SetLocatorProvider(() => locator);

И это используется таким образом:

ServiceLocator.Current.GetInstance<IService>("MyService");

Есть ли способ управлять двумя ServiceLocator или регистрировать дополнительные компоненты в локаторе службы во время выполнения?

Ответы [ 2 ]

13 голосов
/ 09 сентября 2010

Поскольку контейнер Unity зарегистрирован внутри себя, вы можете получить его и настроить:

var container = ServiceLocator.Current.GetInstance<IUnityContainer>();
// do what you want with container
0 голосов
/ 02 сентября 2010

Единственное возможное решение, которое я нашел, - это настроить текущий IUnityContainer, настроенный для ServiceLocator, и перезапустить его. Для этого я использовал отражение следующим образом:

var locator = (UnityServiceLocator) ServiceLocator.Current;
var field = locator.GetType().GetField("container", BindingFlags.NonPublic | BindingFlags.Instance);
if (field != null)
{
  var iocContainer = field.GetValue(ServiceLocator.Current) as IUnityContainer;
  if (iocContainer != null)
  {
   ConfigureContainer(iocContainer);
  }
}
...