如何在 MVVM 应用程序中将 EventAggregator 注册为单例?

How do I register an EventAggregator as a singleton in an MVVM app?

构建我的第一个 MVVM 应用程序,它引入了一些非常强大的概念,但同时要立即学习很多东西。我现在遇到的问题是,当我从另一个 ViewModel 发布事件时,事件订阅者似乎没有收到事件。

我想我需要在 App.xaml.cs 或我的 BootStrapper class 中 new 创建一个 EventAggregator,然后将该实例注入到需要引用它的每个 ViewModel 中.我认为正在发生的事情是为每个视图模型创建一个新的 IEventAggregator,而我 pubbing/subbing 到不同的实例。不确定我的断开连接是与此处的 EventAggregator Pattern/Prism 还是 DI/Autofac。

我应该这样做吗:

public partial class App : Application
{
    //Add this...
    IEventAggregator eventAggregator = new EventAggregator();

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        //... and pass in here somehow?
        var window = new BootStrapper()
            .Bootstrap()
            .Resolve<AView>();

        window.Show();
    }
}

或者像这样:

public class BootStrapper
{
    //Add this...
    IEventAggregator eventAggregator = new EventAggregator();

    public IContainer Bootstrap()
    {
        var builder = new ContainerBuilder();


        builder.RegisterType<AView>()
            .AsSelf();
        builder.RegisterType<AViewModel>()
            .AsSelf();

        builder.RegisterType<OtherViewModel>()
            .As<IOtherViewModel>();
        builder.RegisterType<ADataProvider>()
            .As<IADataProvider>();
        builder.RegisterType<ADataService>()
            .As<IDataService<Account>>();

        //What I'm doing now
        builder.RegisterType<EventAggregator>()
            .As<IEventAggregator>();

        //...and register instance here?

        builder.RegisterType<AccountSelectedEvent>()
            .AsSelf();

        return builder.Build();
    }

在正确方向上的建议、参考或推动同样值得赞赏。谢谢!

尝试从现有的 container-specific 引导程序派生您的引导程序,该引导程序为您完成所有棱镜注册,或者从一个新的 container-specific PrismApplication 类 将在未来的棱镜版本中取代引导程序。

试试 Prism Template Pack,它会为您创建一个最小的可用应用程序。

我想通了,而且……简单得令人尴尬。在我的 BootStrapper

之前

Type 注册正常,但每次请求实例时都会注入一个新实例,所以我是 pubbing 一个,subbing 另一个。

    builder.RegisterType<EventAggregator>()
        .As<IEventAggregator>();

之后

我的天啊

    builder.RegisterType<EventAggregator>()
        .As<IEventAggregator>()
        .SingleInstance;