Мое приложение регистрирует кучу просмотра моделей таким образом:Service Locator работает с приложением, но не динамически экземпляр класса
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.
Какова доступность ViewModelB? Является ли он общедоступным или внутренним? Возможно, вы могли бы опубликовать некоторый код на вашем ViewModelB? –
Почему ViewModelB не зарегистрирован в application_startup? – RLS
@Parth Shah: Добавлен исходный код класса –