ViewModel (устанавливается через AutoWireViewModel="True"
) мой Shell/MainWindow запрашивает зависимость, которая будет загружаться в модуле при запуске с помощью ConfigurationModuleCatalog.
Поскольку оболочка инициализирована перед модулями, контейнер DI, очевидно, не может ее устранить, поэтому приложение аварийно завершает работу.Initialize Shell с ViewModel после загрузки всех модулей в Prism 6
public class MainWindowViewModel : BindableBase
{
// Cannot resolve IService
public MainWindowViewModel(IService service)
{
}
}
Я уже попробовал два подхода this post, но оба не работали.
Я пробовал так:
public interface IShellService
{
int NumberOfLoadedModules { get; }
void FlagModuleAsLoaded();
}
public class ShellService : IShellService
{
private readonly IModuleCatalog _moduleCatalog;
public ShellService(IModuleCatalog moduleCatalog)
{
_moduleCatalog = moduleCatalog;
}
public int NumberOfLoadedModules { get; private set; }
public void FlagModuleAsLoaded()
{
NumberOfLoadedModules++;
if (NumberOfLoadedModules != _moduleCatalog.Modules.Count())
return;
InitializeShell();
}
private static void InitializeShell()
{
Application.Current.MainWindow.Show();
}
}
internal class Bootstrapper : UnityBootstrapper
{
protected override DependencyObject CreateShell()
{
return null;
}
protected override void InitializeShell()
{
}
protected override void ConfigureContainer()
{
base.ConfigureContainer();
Container.RegisterInstance<IShellService>(new ShellService(ModuleCatalog), new ContainerControlledLifetimeManager());
}
protected override IModuleCatalog CreateModuleCatalog()
{
return new ConfigurationModuleCatalog();
}
}
Использование
public abstract class ModuleBase : IModule
{
private readonly IShellService _shellService;
protected ModuleBase(IShellService shellService)
{
_shellService = shellService;
}
public void Initialize()
{
InitializeInternal();
FlagAsLoaded();
}
public abstract void InitializeInternal();
public void FlagAsLoaded()
{
_shellService.FlagModuleAsLoaded();
}
}
public class FooModule : ModuleBase
{
IUnityContainer _container;
public MusicUIModule(IUnityContainer container, IShellService shellService) : base(shellService)
{
_container = container;
}
public override void InitializeInternal()
{
_container.RegisterType<IService, Service>();
}
}
Он начинает считать модули, а затем сбоя приложения из-за той же самой причине.
Если описанный выше подход не подходит для моей цели, как решить эту проблему?
Спасибо!
Чтобы отказаться от подписки, вы также можете сохранить токен подписки, возвращенный из 'Subscribe' и' Dispose'it, чтобы отказаться от подписки. – Haukinger