Prism - подписанное событие не срабатывает - PullRequest
0 голосов
/ 28 октября 2018

У меня следующая ситуация (я работаю над приложением WPF, но не думаю, что это важно):

  • Класс A;
  • Класс B, что этовызывается из A;

Конструктор:

public A(IEventAggregator eventAggregator){
    _eventAggregator = eventAggregator;

    Button = new DelegateCommand(f);

    _eventAggregator.GetEvent<MyEvent>().Subscribe(handleMyEvent);
}

И внизу:

 private void f()
 {
        //here I create a new instance of B with Autofac
        var bootstrap = new Bootstrapper();
        var container = bootstrap.BootStrap();
        BInstance= container.Resolve<B>(new NamedParameter("id", "myId"),
            new NamedParameter("action", "my_action"));
        BInstance.Show(); //here in real I create a view that has a DataContext = B instance
    }

Кроме того, конструктор B выглядит следующим образом:

    public B(IEventAggregator eventAggregator)
    {
        _eventAggregator = eventAggregator;
        // some other stuff
    }

В какой-то момент в классе B я хочу вызвать событие «MyEvent», которое я подписал в конструкторе A.Итак, я делаю что-то вроде этого:

    private void f()
    {
        _eventAggregator.GetEvent<MyEvent>().Publish();
    }

Моя проблема состоит в том, что событие просто не запускается (функция handleMyEvent никогда не выполняет свою работу).

Важная вещь: еслиЯ заменяю эту строку в функции f (на A):

BInstance= container.Resolve<B>(new NamedParameter("id", "myId"),
        new NamedParameter("action", "my_action"));

На:

BInstace = createB() // where createB is a Func<B>

, она работает без каких-либо проблем.Я действительно не понимаю, почему это происходит.Основная проблема заключается в том, что я должен передать некоторые параметры в B-ctor (это не совсем так, поскольку я передаю эти параметры другому классу, который создает экземпляр B, но это не имеет значения).

Примечание: я работаю с Autofac в качестве инжектора зависимостей и Prism для событий.

1 Ответ

0 голосов
/ 28 октября 2018

A и B в вашей настройке работают на разных агрегаторах событий.Конечно, никто не знает о подписках другого.

Вы должны создать и A, и B из одного контейнера:

private void f()
{
    BInstance = _container.Resolve<B>(new NamedParameter("id", "myId"),
        new NamedParameter("action", "my_action"));
    BInstance.Show(); //here in real I create a view that has a DataContext = B instance
}

Для этогодля работы, A нужен контейнер:

public A(IEventAggregator eventAggregator, IContainer container){
    _eventAggregator = eventAggregator;
    _container = container;
}

Но будьте осторожны, инъекция контейнера - это запах кода, если не сказать больше.Если это реальное приложение, создайте класс фабрики для создания ваших B экземпляров.

...