问题标签 [eventaggregator]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1477 浏览

silverlight - 如何将事件聚合添加到现有 Silverlight 应用程序?

我有一个现有的 Silverlight 应用程序,其中 Page.xaml 上有一些按钮,可将用户控件加载到 TransitioningContentControl 内容主机中。这些用户控件中的每一个都绑定到一个视图模型。有时,当对一个用户控件进行更改时,需要更新其他用户控件中的数据。我一直在考虑在 Prism 中使用事件聚合器,但真的不想将所有内容都转换为 shell、模块等。有什么方法可以让我在不使用 Prism 的情况下添加事件聚合?

0 投票
1 回答
3315 浏览

multithreading - Prism EventAggregator 可以用于线程需求吗?

我在看 Prism EventAggregator 和它的伟大。我最关心的部分是它能够正确地将线程编组到 UI 线程。

我想知道是否可以使用此功能为模块开发人员提供一个类,该类可用于以与 BackgroundWorker 类似的方式创建线程。类的接口可能有点类似于

为了更好地理解,我保留了类似于 backgroundworker 的类型。在实现中,我正在注册 taskstart 和 taskcomplete 事件

在 MyTask 类的构造函数中,我将需要完成的线程作为

在这里,我正在向过滤器注册,其中过滤器函数仅在它具有与订阅时获得的相同令牌时才返回事件。

我进一步使用

这个类可以用作

我在这种方法中看到的好处是 1. 它使用线程池,因此没有像在 backgroundWorker 中那样创建线程的开销。2. 适当的线程编组,以防 RunWorkerCompleted 在 UI 线程上执行。

请建议将 eventtaggregator 用作 Threader 是否正确。

0 投票
3 回答
10215 浏览

c# - 如何在 UIThread 上测试 Prism 事件聚合器订阅?

我有一个类,它通过 PRISMs 事件聚合器订阅一个事件。

由于这里提到的模拟事件聚合器有点困难,我只是实例化一个真实的聚合器并将其传递给被测系统。

然后在我的测试中,我通过该聚合器发布事件,然后检查我的被测系统如何对其做出反应。由于该事件将在生产期间由 FileSystemWatcher 引发,因此我想通过订阅 UIThread 来利用自动调度,因此一旦引发事件,我就可以更新我的 UI。

问题是,在测试期间,除非我不在 UIThread 上订阅,否则事件在被测系统中永远不会被注意到。

我正在使用 MSpec 进行测试,我通过 TDD.Net 从 VS2008 内部运行。添加[RequiresSta]到我的测试类没有帮助

有没有人有一个解决方案,可以避免我在测试期间更改 ThreadOption(例如通过属性 - 多么丑陋的黑客)???

0 投票
1 回答
310 浏览

castle-windsor - Castle Windsor:启动服务时的自定义处理

Windsor 实例化类型时是否可以执行一些自定义处理?

类似于:

目前我们正在使用IStartable。由于“开始”代码(即自定义处理)是相同的,因此最好将此逻辑移出每个类。

谢谢!布赖恩

0 投票
1 回答
599 浏览

wpf - 具有持久订阅者行为的 WPF/SL EventAggregator 实现?

目前我正在使用最新的 Prism for Silverlight 4 构建一个应用程序。我有一个模块,在该模块中我有两个带有视图模型的视图。我还有一个模块视图,每个视图有两个区域。在模块初始化中,我在 Unity 容器中注册了我的视图和视图模型,并在相应的区域中注册了视图。问题是视图应该显示类似于表详细信息的信息 - 第一个视图显示可用实体,而第二个视图显示所选实体的详细信息。

我需要一种方法来传递他们初始选定的实体。新创建的第一个视图没有任何选定的实体,新创建的第二个视图不显示任何详细信息。

目前我正在这样做:在模块中,我创建了两个视图模型并将它们注册为 Unity 容器中的实例,然后我将视图注册为相应区域的类型。每个视图都从 EventAggregator 订阅 EntitySelectedEvent。模块初始化程序在初始化后发布此事件,这样两个视图正在选择同一个实体。

我知道这看起来很难看——我尝试从一个视图模型发布这个事件,但问题是 Prism 中的 EventAggregator 不支持持久订阅者——这意味着如果第二个视图模型在第一个视图模型之前没有订阅事件解雇它,它不会接收和事件。我知道这是 EventAggregator 的正常行为,但是当视图模型可以触发事件而不依赖于它们的初始化顺序时,我正在寻找一种解决方案——即第一个模型可以在创建第二个模型和第二个模型之前触发事件订阅后将收到此“排队”事件。

是否有任何其他支持此类行为的 WPF/SL 消息传递实现或使用调解器(在我的示例中它是一个模块本身)毕竟不是一个坏主意?mediator 的一个大问题是模型必须在初始化时立即创建,并且它们不能在容器中注册为类型,因为这再次导致缺少订阅者。

0 投票
3 回答
2597 浏览

wpf - EventAggregator,它是线程安全的吗?

这是线程安全的吗?

Prism 中的 EventAggregator 是一个非常简单的类,只有一个方法。当我注意到空检查和创建新类型以添加​​到私有 _events 集合时没有锁定时,我感到很惊讶。如果两个线程同时为同一类型调用 GetEvent(在它存在于 _events 之前),看起来这将导致集合中的两个条目。

0 投票
1 回答
275 浏览

.net-3.5 - 将 SynchronizationContext 的 EventAggregators 用法转换为 VB.Net

使用相当大的 VB.Net 后台 winforms 应用程序。100 万+ LOC。大泥球,90% 的代码都在表单和其他 UI 控件中。

在时间和资源允许的情况下慢慢引入更好的架构,我们一直在使用 Jeremy Miller 的 EventAgrgator 的想法。

http://codebetter.com/blogs/jeremy.miller/archive/2008/01/11/build-your-own-cab-extensible-pub-sub-event-aggregator-with-generics.aspx

最初我去掉了 SynchronizationContext 的使用。现在我试图把它介绍回来,我正在努力将 lamda 的东西从 c# 翻译成 vb.net。

特别是这行c#

这是我到目前为止的 vb.net:

我得到的错误是

listener.Handle(message) <-- AddressOf 操作数必须是方法的名称。

我确定我错过了一些简单的东西,但是在盯着这个 2 天之后,我迷路了。

0 投票
1 回答
323 浏览

c# - 如何判断一个动作是否是 lambda 表达式?

我正在使用 EventAgregator 模式来订阅和发布事件。如果用户使用 lambda 表达式订阅事件,他们必须使用强引用,而不是弱引用,否则表达式可能会在发布执行之前被垃圾回收。

我想在 DelegateReference 中添加一个简单的检查,以便如果程序员传入 lambda 表达式并使用弱引用,我会抛出一个参数异常。这是为了帮助“监管”代码。

例子:

有任何想法吗?我以为我可以检查 @delegate.Method.IsStatic 但我不相信它有效......(每个 lambda 表达式都是静态的吗?)

0 投票
2 回答
1858 浏览

silverlight - 我可以删除 EventAggregator 中的重复事件吗?

我有一个非常简单的场景,我无法正常工作。我有 2 个视图,即 CarView 和 CarWindowView(子窗口)以及相应的 ViewModel。在我的 CarView 中,我有一个 EditButton 可以打开 CarWindowView(子窗口),我可以在其中编辑 Car 对象字段。

我的问题是我的 CarWindowView ViewModel 中的 DisplayModule 方法被调用了太多次......当我第一次按下编辑按钮时,它被调用一次,第二次被调用两次,第三次被调用 3 次和如此堡垒……!

CarView ViewModel 构造函数:

CarView ViewModel HandleEditCarBtnClick 方法:

CarWindowView ViewModel 构造函数:

CarWindowView ViewModel DisplayModule 方法(该方法被调用太多次):

所以,我无法理解我如何只能让 EventAggregator 只存储一次单击,而不是我对“编辑”按钮的所有单击。对不起,如果这不是很好的解释!帮助赞赏!

0 投票
1 回答
431 浏览

c# - EventAggregator中如何支持持久化?

我在 Prism 中使用 EventAggregator,我希望事件保持不变,这意味着当客户端订阅某个事件时,聚合器会发布之前错过的事件给客户端。有没有办法支持这一点?

我知道这听起来更像是消息队列之类的。但是系统已经与 EventAggregator 高度耦合,因此我希望这个框架可以让我有选择地保留一些事件而无需太多修改。