Исключение NullReferenceException в методе Caliburn.Micro DisplayRootViewFor при попытке использовать EventAggregator

87
10

Я пытаюсь использовать встроенный EventAggregator Caliburn Micro в моем проекте WPF на основе этой документации. Но документация (как я почти всегда нахожу ее с помощью Caliburn Micro) кажется неполной, то есть пример кода не содержит всех требований к реализации.


В частности, я не использовал контейнер IoC в своем проекте, и я уверен, что мне не хватает или неправильно использует часть его конфигурации, и это вызывает проблему.


Проблема:


    Я получаю NullReferenceException в методе DisplayRootViewFor при запуске.
    Я, очевидно, знаю, что такое NullReferenceException, но я хотел бы знать, как решить эту проблему, конкретно связанную с конфигурацией загрузочного буфера Caliburn Micro (и помочь другим пользователям, которые могут столкнуться с одной и той же проблемой при попытке сделать то же самое).

Примечания:


    Понятно, что мне непонятно, как работает загрузочный файл приложения, поскольку я всегда считал, что документация Caliburn Micro очень сложна для сравнения (по сравнению с MSDN), и раньше я не использовал контейнер IoC.
    NullReferenceException подключен к методу переопределения GetInstance, как если бы я его прокомментировал, я получаю исключение "Без параметров без конструктора для этого объекта".
    Я уже пробовал решение в этом вопросе, но, похоже, это не имело никакого значения.

Может ли кто-нибудь объяснить мне, почему Caliburn.Micro выбрасывает это исключение и как я должен вставлять EventAggregator в мою главную модель просмотра? (потому что пытаюсь передать его как параметр в DisplayRootViewFor, похоже, не работает.)


My app bootstrapper выглядит следующим образом - на основе комбинации Агрегатор событий и Простые контейнеры IoC:


public class AppBootstrapper : BootstrapperBase
{
private readonly SimpleContainer _container =
new SimpleContainer();

public AppBootstrapper()
{
Initialize();
}

protected override void Configure()
{
_container.Singleton<IEventAggregator, EventAggregator>();
}

protected override object GetInstance(Type serviceType, string key)
{
return _container.GetInstance(serviceType, key);
}

protected override IEnumerable<object> GetAllInstances(Type serviceType)
{
return _container.GetAllInstances(serviceType);
}

protected override void BuildUp(object instance)
{
_container.BuildUp(instance);
}

protected override void OnStartup(object sender, StartupEventArgs e)
{
DisplayRootViewFor<MainViewModel>();
}
}


И мой конструктор MainViewModel выглядит следующим образом: настройте для ввода EventAggregator:


public MainViewModel(IEventAggregator eventAggregator)
{
_eventAggregator = eventAggregator;
}

спросил(а) 2021-01-19T19:22:04+03:00 2 месяца, 4 недели назад
1
Решение
97

Используйте RegisterPerRequest для регистрации самого типа модели представления. Попробуйте следующее:

public class HelloBootstrapper : BootstrapperBase
{
private readonly SimpleContainer _container = new SimpleContainer();
public HelloBootstrapper()
{
Initialize();
}

protected override void OnStartup(object sender, StartupEventArgs e)
{
base.OnStartup(sender, e);
DisplayRootViewFor<MainViewModel>();
}

protected override void Configure()
{
_container.Singleton<IWindowManager, WindowManager>();
_container.Singleton<IEventAggregator, EventAggregator>();
_container.RegisterPerRequest(typeof(MainViewModel), null, typeof(MainViewModel));
}

protected override object GetInstance(Type serviceType, string key)
{
return _container.GetInstance(serviceType, key);
}

protected override IEnumerable<object> GetAllInstances(Type serviceType)
{
return _container.GetAllInstances(serviceType);
}

protected override void BuildUp(object instance)
{
_container.BuildUp(instance);
}
}

ответил(а) 2021-01-19T19:22:04+03:00 2 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема