尝试使用EventAggregator时Caliburn.Micro的DisplayRootViewFor方法中的NullReferenceException

时间:2017-04-06 08:49:41

标签: c# wpf ioc-container caliburn.micro

我正在尝试在我的WPF项目中使用Caliburn Micro的内置EventAggregator,基于this documentation。但是文档(我几乎总是用Caliburn Micro找到它)似乎不完整,即示例代码不包含所有实现要求。

特别是,我没有在我的项目中使用IoC容器,我确信我丢失或滥用其配置的某些部分,这导致了问题。

问题:

  • 我在启动时NullReferenceException方法中获得了DisplayRootViewFor
  • 我显然知道NullReferenceException通常是什么,但我想知道如何解决与Caliburn Micro的app bootstrapper配置特别相关的问题(以及帮助其他在尝试时遇到同样问题的用户)做同样的事情。)。

备注:

  • 不可否认,我不清楚应用程序引导程序是如何工作的,因为我总是发现Caliburn Micro的文档非常难以理解(与MSDN相比),之前我没有使用过IoC容器。
  • NullReferenceException已连接到GetInstance覆盖方法,就像我将其注释掉一样,我得到“没有为此对象定义的无参数构造函数”异常。< / LI>
  • 我已经尝试过解决方案in this question,但似乎没有任何区别。

有人可以向我解释为什么Caliburn.Micro会抛出此异常,以及我应该如何将EventAggregator注入我的主视图模型?(因为尝试将其传递为DisplayRootViewFor中的参数似乎不起作用。)

我的应用程序引导程序如下所示 - 基于The Event AggregatorSimple IoC Container文档页面的组合:

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;
}

1 个答案:

答案 0 :(得分:5)

使用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);
    }
}