Unity container Unity ServiceLocator,运行时注册类型

Unity container Unity ServiceLocator,运行时注册类型,unity-container,service-locator,Unity Container,Service Locator,我有一个使用Unity DI和EntLib服务定位器的小工具包。当第三方应用程序尝试使用EntLib服务定位器时,会出现此问题。看起来EntLib服务定位器是单例的,所以当第三方应用程序引导其服务定位器时,它会清除我的服务定位器的配置。 客户端通过以下方式创建服务定位器: container = new UnityContainer(); locator = new UnityServiceLocator(Initialize()); Servic

我有一个使用Unity DI和EntLib服务定位器的小工具包。当第三方应用程序尝试使用EntLib服务定位器时,会出现此问题。看起来EntLib服务定位器是单例的,所以当第三方应用程序引导其服务定位器时,它会清除我的服务定位器的配置。 客户端通过以下方式创建服务定位器:

        container = new UnityContainer();
        locator = new UnityServiceLocator(Initialize());
        ServiceLocator.SetLocatorProvider(() => locator);
ServiceLocator.Current.GetInstance<IService>("MyService");
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);
  }
}
它是这样使用的:

        container = new UnityContainer();
        locator = new UnityServiceLocator(Initialize());
        ServiceLocator.SetLocatorProvider(() => locator);
ServiceLocator.Current.GetInstance<IService>("MyService");
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);
  }
}
ServiceLocator.Current.GetInstance(“MyService”);

有没有办法在运行时管理两个ServiceLocator或在ServiceLocator中注册其他组件?

我找到的唯一可行的解决方案是为ServiceLocator配置当前的IUnityContainer并回收它。 为了做到这一点,我以这种方式使用了反射:

        container = new UnityContainer();
        locator = new UnityServiceLocator(Initialize());
        ServiceLocator.SetLocatorProvider(() => locator);
ServiceLocator.Current.GetInstance<IService>("MyService");
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);
  }
}

我找到的唯一可行的解决方案是为ServiceLocator配置当前的IUnityContainer并回收它。 为了做到这一点,我以这种方式使用了反射:

        container = new UnityContainer();
        locator = new UnityServiceLocator(Initialize());
        ServiceLocator.SetLocatorProvider(() => locator);
ServiceLocator.Current.GetInstance<IService>("MyService");
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);
  }
}

由于Unity容器是在其自身中注册的,因此您可以获取它并配置:

var container = ServiceLocator.Current.GetInstance<IUnityContainer>();
// do what you want with container
var container=ServiceLocator.Current.GetInstance();
//用容器做你想做的事

由于Unity容器是在其内部注册的,因此您可以获取它并配置:

var container = ServiceLocator.Current.GetInstance<IUnityContainer>();
// do what you want with container
var container=ServiceLocator.Current.GetInstance();
//用容器做你想做的事