使用EventAggregator时,在Caliburn.Micro的DisplayRootViewFor方法中出现NullReferenceException。

4

我正在尝试在我的WPF项目中使用Caliburn Micro内置的EventAggregator,基于这份文档。但是文档(就像我几乎总是发现的那样)似乎不完整,即示例代码不包含所有实现要求。

特别是,在我的项目中没有使用IoC容器,我确定我缺少或错误使用了其配置的某些部分,这导致了问题。

问题:

  • 在启动时,DisplayRootViewFor方法中出现NullReferenceException
  • 我显然知道什么是NullReferenceException,但我想知道如何解决与Caliburn Micro应用程序引导程序配置相关的此特定问题(并帮助其他用户在尝试执行相同操作时可能遇到的相同问题)。

备注:

  • 不可否认,我不清楚应用程序引导程序的工作原理,因为我始终发现Caliburn Micro的文档非常难以理解(与MSDN相比),而且我以前没有使用过IoC容器。
  • NullReferenceExceptionGetInstance重写方法相关,如果我将其注释掉,我将获得“未为此对象定义无参构造函数”异常。
  • 我已经尝试了这个问题中的解决方案,但似乎没有任何区别。

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


我的应用程序引导程序看起来像下面这样-基于事件聚合器简单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;
}
2个回答

10

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

你又帮我解决了问题!:) 谢谢。我会仔细阅读 RegisterPerRequest 以了解发生了什么。 - Leaky

0

此外,以下代码片段在为每个ViewModel注册时也对我有用:

public class BootStrapper : BootstrapperBase     {

    protected SimpleContainer _container = new SimpleContainer();
    public BootStrapper()
    {
        Initialize();
    }

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

        GetType().Assembly.GetTypes()
            .Where(type => type.IsClass)
            .Where(type => type.Name.EndsWith("ViewModel"))
            .ToList()
            .ForEach(viewModelType => _container.RegisterPerRequest(
                viewModelType, viewModelType.ToString(), viewModelType));
    }

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

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

    }

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接