Unity container Unity ServiceLocator,运行时注册类型
我有一个使用Unity DI和EntLib服务定位器的小工具包。当第三方应用程序尝试使用EntLib服务定位器时,会出现此问题。看起来EntLib服务定位器是单例的,所以当第三方应用程序引导其服务定位器时,它会清除我的服务定位器的配置。 客户端通过以下方式创建服务定位器: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
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();
//用容器做你想做的事