2010-09-02 5 views
0

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

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

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

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

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

ответ

12

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

var container = ServiceLocator.Current.GetInstance<IUnityContainer>(); 
// do what you want with container 
+0

Он работает мой человек, благодаря за тонну! – Raffaeu

0

Единственным возможным решением, которое я нашел, является получение текущего 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); 
    } 
} 
Смежные вопросы