2015-06-13 3 views
2

Мое приложение регистрирует кучу просмотра моделей таким образом: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.

+0

Какова доступность ViewModelB? Является ли он общедоступным или внутренним? Возможно, вы могли бы опубликовать некоторый код на вашем ViewModelB? –

+0

Почему ViewModelB не зарегистрирован в application_startup? – RLS

+0

@Parth Shah: Добавлен исходный код класса –

ответ

0

Я не знаю, почему, но сегодня проблема, о которой я писал, больше не возникает ... динамически загруженная сборка теперь может выполнять ServiceLocator.Current.GetInstance(); не выбрасывая исключение. Если я смогу вернуть его в состояние сбоя, я добавлю основную причину этого ответа для дальнейшего использования.

Смежные вопросы