Как зарегистрировать EventAggregator как синглтон в приложении MVVM?

Создаю свое первое приложение MVVM, и оно знакомит с некоторыми действительно мощными концепциями, но в то же время нужно многому научиться сразу. Проблема, с которой я сталкиваюсь сейчас, заключается в том, что подписчики событий, похоже, не получают события, когда я публикую их из другой ViewModel.

Я думаю, мне нужно new создать EventAggregator в App.xaml.cs или в моем классе BootStrapper, а затем внедрить этот экземпляр в каждую ViewModel, которая должна на него ссылаться. Я думаю, что происходит то, что для каждой модели представления создается новый IEventAggregator, и я публикую/подписываюсь на разные экземпляры. Не уверен, связано ли мое отключение с шаблоном/призмой EventAggregator или 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();
    }

Советы, ссылки или подталкивание в правильном направлении одинаково ценятся. Спасибо!


person CaptainMarvel    schedule 16.02.2018    source источник


Ответы (2)


Я понял это, и это было... до безобразия просто. В моем BootStrapper

До

Тип регистрировался нормально, но вводил новый экземпляр каждый раз, когда запрашивался экземпляр, поэтому я был pubbing для одного, subbing для другого.

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

После

О Боже.

    builder.RegisterType<EventAggregator>()
        .As<IEventAggregator>()
        .SingleInstance; 
person CaptainMarvel    schedule 16.02.2018

Попробуйте либо создать загрузчик из существующего загрузчика, специфичного для контейнера, который выполняет все регистрации prism за вас, либо получить свое приложение из одного из новых классов PrismApplication, специфичных для контейнера, которые заменят загрузчик в будущих версиях prism.

Попробуйте Prism Template Pack. Он создает минимальное работающее приложение для ты.

person Haukinger    schedule 16.02.2018
comment
Спасибо, что нашли время ответить. В итоге я нашел решение autofac (см. мой ответ), но я думаю, что это тоже хороший подход. - person CaptainMarvel; 16.02.2018
comment
Просто будьте осторожны, чтобы зарегистрировать все типы, которые вам нужны, агрегатор событий — лишь один из многих... PrismApplicationBase.cs#L114" rel="nofollow noreferrer">github.com/PrismLibrary/Prism/blob/ и github.com/PrismLibrary/Prism/blob/master/Source/Wpf/ - person Haukinger; 16.02.2018