棱镜-订阅的事件不会触发

时间:2018-10-28 17:45:34

标签: wpf prism autofac

我有以下情况(我正在使用WPF应用程序,但我认为这并不重要):

  • A级;
  • 从A调用的B类;

构造函数:

render

在底部:

{blogs}

此外,B构造函数如下所示:

public A(IEventAggregator eventAggregator){
    _eventAggregator = eventAggregator;

    Button = new DelegateCommand(f);

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

在B类中的某个时刻,我想触发我在A构造函数中订阅的事件“ MyEvent”。所以,我做这样的事情:

 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
    }

我的问题很简单,事件不会触发(handleMyEvent函数从不执行工作)。

重要的事情: 如果我将这行替换为f函数(在A上):

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

使用:

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

它可以正常工作。我真的不明白为什么会这样。 主要的问题是我必须将一些参数传递给B ctor(这不是完全正确的,因为我将这些参数传递给了实例化B的另一个类,但没有关系)。

注意:我正在使用Autofac作为事件的依赖注入程序和Prism。

1 个答案:

答案 0 :(得分:0)

设置中的

AB在不同的事件聚合器上工作。当然,一个人不知道另一个人的订阅。

您必须在同一容器中同时创建AB

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实例。