Мое приложение регистрирует кучу моделей представления следующим образом:
static App()
{
GalaSoft.MvvmLight.Threading.DispatcherHelper.Initialize();
Microsoft.Practices.ServiceLocation.ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
}
private void Application_Startup(object sender, StartupEventArgs e)
{
SimpleIoc.Default.Register<ViewModelA>();
...
}
и я могу получить доступ к ViewModelA, используя:
ServiceLocator.Current.GetInstance<ViewModelA>()
Но когда приложение выполняется:
obj = (MyClass)Activator.CreateInstance(typeof(MyClass);
чтобы создать экземпляр класса из сборки плагина, его конструктор выполняет:
public MyClass()
{
SimpleIoc.Default.Register<ViewModelB>();
var vm = SimpleIoc.Default.GetInstance<ViewModelB>();
var serviceLocator = ServiceLocator.Current;
var referenceSetUpTabViewModel = serviceLocator.GetInstance<ViewModelB>();
InitializeComponent();
}
ViewModelB в настоящее время является просто пустым классом:
public class ViewModelB
{
}
Переменная vm содержит экземпляр ViewModelB, а переменная serviceLocator равна GalaSoft.MvvmLight.Ioc.SimpleIoc, но строка serviceLocator.GetInstance выдает исключение:
An exception of type 'Microsoft.Practices.ServiceLocation.ActivationException' occurred in GalaSoft.MvvmLight.Extras.dll but was not handled in user code
Additional information: Type not found in cache: ViewModelB
Поскольку переменная vm была установлена, вроде бы тип был успешно зарегистрирован, так почему же сервис-локатор не может его получить?
Помимо упрощения переключения на другой контейнер, есть ли еще какая-то причина, по которой рекомендуется использовать ServiceLocator? Я изолировал свое использование контейнера в Application_Startup и классе ViewModelLocator, поэтому, если в будущем я выберу что-то более тяжелое, чем SimpleIoc, миграция будет довольно тривиальной.
Использование Microsoft VS2013 Update 4, .NET 4.5.2, MVVM-Light 5.1.1, CommonServiceLocator 1.3.
SimpleIoc
, возвращаемыйServiceLocator.Current
, отличается отSimpleIoc.Default
. Есть ли способ проверить, действительно ли это одна и та же ссылка? - person mclark1129   schedule 15.06.2015