代码之家  ›  专栏  ›  技术社区  ›  CaptainMarvel

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

  •  3
  • CaptainMarvel  · 技术社区  · 7 年前

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

    我想我需要 new 在应用程序中启动EventAggregator。xaml。cs或在我的 BootStrapper 类,然后将该实例注入到需要引用它的每个ViewModel中。我想现在发生的是 IEventAggregator 正在为每个视图模型创建,我正在发布/子发布到不同的实例。不确定此处是否与EventAggregator模式/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();
        }
    

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

    2 回复  |  直到 7 年前
        1
  •  2
  •   CaptainMarvel    7 年前

    我想出来了,结果。。。令人尴尬的简单。在我的 BootStrapper

    之前

    类型注册很好,但每次请求实例时都会注入一个新实例,所以我 pubbing 到一个, subbing 给另一个人。

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

    之后

    哦,我的上帝。

        builder.RegisterType<EventAggregator>()
            .As<IEventAggregator>()
            .SingleInstance; 
    
        2
  •  0
  •   Haukinger    7 年前

    尝试从现有的特定于容器的引导程序派生您的引导程序,该引导程序为您完成所有prism注册,或者从新的特定于容器的引导程序派生您的应用程序 PrismApplication 将在未来的prism版本中取代引导程序的类。

    给出 Prism Template Pack 一次尝试,它为您创建了一个最小的、可用的应用程序。

    推荐文章