我正在执行一个事件聚集棱镜。我有几个模块,我想他们每个人订阅事件,告诉他们,当他们的要求。我开始了这样做的所有普通的例子与两订和发布服务器的外壳。没有问题。现在;当我移动用户出我的模块,他们没有得到触发的。更奇怪的是,它实际上已经工作了几次-好的,我一直待在一个断点。所以这对我来说似乎是一些竞争条件,但我不明白为什么。

假设: 我不需要设置IEventAggregator任何地方--例如注册在国际奥委会的容器?这是建立这样的棱镜,我仅有的一个实例,该活动聚集,对吗?

因此,问题基本上是如何/何在哪里/时我设定了我的订户。是否有一个特定的顺序上的东西,等等?在我简化例子,我有一个模块MyModule.引导程序将增加MyModule要目录,使其初始化:

catalog.AddModule(typeof(MyModule));

MyModule将储存的聚集和使用这个用于订阅MyModuleRequestedEvent.它还使用一个菜单,登记册登记在应用单。这个想法是,最终击在菜单中都应触发事件通知MyModule,它已经被请求。然后我希望它是MyModule的责任搞清楚该怎么做进一步。

public MyModule(IEventAggregator aggregator, IApplicationMenuRegistry menu)
{
    _applicationMenu = menu;
    _aggregator = aggregator;
}

public void Initialize()
{
    var evnt = _aggregator.GetEvent<MyModuleRequestedEvent>();
    evnt.Subscribe(MyModuleRequested);
    _applicationMenu.RegisterMenuItem("MyModule", evnt);
}

public void MyModuleRequested(bool b)
{
    MessageBox.Show("MyModule requested");
}

现在,我有一个按钮在我的外壳将发布这一事件。壳得到相同的(?) 活动聚集的时候得到解决。

public Shell(IEventAggregator aggregator)
{
    InitializeComponent();
    var evnt = aggregator.GetEvent<MyModuleRequestedEvent>();
    EventTriggerButton.Click += (s, e) => evnt.Publish(true);
}

注:

  • 已经证实的事件发表。添加一个用户在壳也将使这个订户收到的事件。
  • 再次;用户在MyModule不是触发的。然而,它具有-奇怪-已在几个场合。
  • 我不使用输入的事件。这似乎是你需要有一些投入类型,所以我只是去与一个虚拟bool。我可以摆脱这个..?
有帮助吗?

解决方案

棱镜事件的聚合器使用的软弱引用的链接活动。这是为了防止存储器泄漏事件的处理程序。

一旦一个模块,初始化程序已经运行它的设置的,因此事件处理程序是正在摧毁以前的事件是被解雇。你可以告诉棱镜保持事件处理程序通过使用一个载的订阅。

evnt.Subscribe(MyModuleRequested, true);

作为一种模式,我倾向于把任何事件的用户在一个单独的类,并呼吁这类模块化方法。这样的事件的活下去但是独立的,同时该模块仍被摧毁。

其他提示

因此,我刚刚得到一个理论,但是没有时间来检验它的权利。会做的明天。

问题:将增加模块的ModuleCatalogue让他们活着吗?我以为它会。因此-MyModule应该留活着-然后触发事件时出版。

protected override IModuleCatalog GetModuleCatalog()
{
    var catalog = new ModuleCatalog();
    catalog.AddModule(typeof(MyModule));
    return catalog;
}

然而,如果这不能保持的模块活着,这是显而易见的,它将很难应对的事件。该模块对象死亡,但它不能取消,因此我将会看到用户在EventAggregator名单,但用户不在身边了.也;我提到,我就不会在实际上工作的偶尔将这种情况,如果垃圾收集没有时间拿出垃圾桶里之前的事件被触发。

这种声音不会喜欢的情况下?如果是这样的-我没有想到的一个解决方案又是那么你是受欢迎的建议之一在一个不同的答复线..

如此;什么是ModuleCataloge?只是一个列表中的保留的初始化,然后扔掉?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top