Здравствуйте. Я пытаюсь настроить архитектуру, в которой при запуске приложения загружается только один модуль. Тогда я бы хотел лениво загрузить другие модули в зависимости от действий пользователя.
Для достижения этого в моем app.xaml.cs один модуль загружается в bootstrap время (MainModule), а другой имеет InitializationMode = InitializationMode.OnDemand
protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{
Type BlipModuleType = typeof(BlipModule);
moduleCatalog.AddModule(new ModuleInfo()
{
ModuleName = BlipModuleType.Name,
ModuleType = BlipModuleType.AssemblyQualifiedName,
InitializationMode = InitializationMode.OnDemand
});
moduleCatalog.AddModule<MainModule>();
}
, затем мой Основной модуль, который отображает представление правильно, имеет единственный вид, зарегистрированный для единственного доступного региона:
public class MainModule : IModule
{
private readonly IRegionManager _regionManager;
public MainModule(IRegionManager regionManager)
{
_regionManager = regionManager;
}
public void OnInitialized(IContainerProvider containerProvider)
{
_regionManager.RegisterViewWithRegion(RegionNames.ContentRegion, typeof(ViewA));
}
public void RegisterTypes(IContainerRegistry containerRegistry)
{
}
}
Ленивый загруженный модуль имеет ту же структуру, регистрируя другое представление (которое работает правильно, если я решу используйте его как мой основной модуль)
public class BlipModule : IModule
{
private readonly IRegionManager _regionManager;
public BlipModule(IRegionManager regionManager)
{
_regionManager = regionManager;
}
public void OnInitialized(IContainerProvider containerProvider)
{
_regionManager.RegisterViewWithRegion(RegionNames.ContentRegion, typeof(ViewB));
}
public void RegisterTypes(IContainerRegistry containerRegistry)
{
}
}
наконец-то у меня есть команда в viewmodel моего MainModule ViewA, которая должна загрузить новый модуль и перейти к нему.
public class ViewAViewModel : BindableBase
{
const string BlipModuleName = "BlipModule";
public ReactiveCommand ChangeRoute { get; set; } = new ReactiveCommand();
public ViewAViewModel(IRegionManager regionManager, IModuleManager moduleManager)
{
ChangeRoute.Subscribe(res =>
{
moduleManager.LoadModule(BlipModuleName);
});
moduleManager.LoadModuleCompleted += (s, e) =>
{
if (e.ModuleInfo.ModuleName == BlipModuleName)
{
regionManager.RequestNavigate(RegionNames.ContentRegion, new Uri(BlipModuleName, UriKind.Relative));
}
};
}
}
ViewB BlipModule фактически загружен (я получаю удар, если я устанавливаю точку останова в конструкторе представления), но вместо представления я получаю белую страницу с "System.Object" внутри него. Есть идеи? спасибо!