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.


person Jim C    schedule 13.06.2015    source источник
comment
Какова доступность ViewModelB? Он общедоступный или внутренний? Возможно, вы могли бы опубликовать код на ViewModelB?   -  person Parth Shah    schedule 13.06.2015
comment
Почему ViewModelB не прописан в application_startup?   -  person RLS    schedule 13.06.2015
comment
@Parth Shah: добавлен исходный код класса   -  person Jim C    schedule 15.06.2015
comment
@RLS: я динамически загружаю сборку, содержащую ViewModelB, после выполнения application_startup.   -  person Jim C    schedule 15.06.2015
comment
Единственное, о чем я могу думать, это то, что экземпляр SimpleIoc, возвращаемый ServiceLocator.Current, отличается от SimpleIoc.Default. Есть ли способ проверить, действительно ли это одна и та же ссылка?   -  person mclark1129    schedule 15.06.2015
comment
@Mike C: я добавил SimpleIoc.Default и ServiceLocator.Current в окно просмотра и сделал две вещи: 1) углубился в объекты и обнаружил, что у обоих есть 29 зарегистрированных моделей представлений (все зарегистрированы в основном приложении), и 2) добавлено идентификатор объекта, подтверждающий идентичность обоих объектов.   -  person Jim C    schedule 15.06.2015
comment
@JimC, если вы скопируете и вставите код из конструктора MyClass в Application_Startup, возникнут ли какие-либо исключения?   -  person Parth Shah    schedule 16.06.2015
comment
@Parth Shah: я скопировал/вставил код в App_Startup, и он не сработал. Конечно, мне пришлось заменить другой класс, потому что ViewModelB не существует в приложении (ViewModelB определен в сборке подключаемого модуля, загружаемой во время выполнения).   -  person Jim C    schedule 16.06.2015


Ответы (1)


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

person Jim C    schedule 16.06.2015