我的需求
我希望我们的内部标准产品在事情发生时触发不同的事件。在不同自定义解决方案的 global asax 中,我想在需要时连接这些事件并做出反应。
现有模块
我一直在寻找用于 asp.net 的事件聚合器,但我不确定要使用什么。我读过 Prism,但它似乎针对 WPF/Silverlight 而不是 asp.net。
然后是这个人,他似乎将聚合器移植到他自己的版本中,独立于 WPF:http : //weblogs.asp.net/rashid/archive/2009/03/05/use-event-aggregator-to-使您的应用程序更可扩展.aspx
题
有没有人在 asp.net 上使用事件聚合器的经验?这是用于生产用途,所以我不想使用网络上随机人员提供的一些家庭编码聚合器:)
先感谢您。
编辑 1: 看起来,NServiceBus 为此目的有点矫枉过正。我创建了一个单独的 EventAggregator 类来解决这个问题。
班上:
/// <summary>
/// A event aggregator.
/// </summary>
public class EventAggregator
{
/// <summary>The object to use when locking.</summary>
private readonly object _lock = new object();
/// <summary>Holder of registered event handlers</summary>
private readonly Dictionary<Type, List<object>> _handlers = new Dictionary<Type, List<object>>();
/// <summary>Registers the specified handler.</summary>
/// <typeparam name="T"></typeparam>
/// …
Run Code Online (Sandbox Code Playgroud) 我只是想总结一列并在表格的底部显示总数.从查看示例看,使用聚合器似乎是最好的方法.但是,当我简单地添加
dataView.setAggregators([
new Slick.Data.Aggregators.Sum("value")
], false);
什么都没发生.我已经尝试了几个小时来让一个简单的聚合器基于分组示例工作,但分组示例太复杂了,我无法准确地告诉我需要什么.
编辑:替代修复:对于其他任何人,我最终没有使用聚合器.这些数据在Javascript中可用,这使得生活变得更加容易.总计可以从那里计算出来.
作为一个例子,假设我有以下课程:
public class FruitBasket {
private List<Apple> apples;
private List<Orange> oranges;
// getters and setters...
}
Run Code Online (Sandbox Code Playgroud)
现在假设我还有一个方法可以获取FruitBasket
.
public FruitBasket getFruitBasket() {
//...
}
Run Code Online (Sandbox Code Playgroud)
现在进一步假设该getFruitBasket
方法聚合来自两个不同源的数据,这些数据是通过代理访问的。例如,有一个服务器AppleTree
用于获取类型 的对象Apple
,还有一个服务器OrangeTree
用于获取类型 的对象Orange
,并且两者都通过名为 的代理进行访问OrchardGate
。这就是为什么我想编写一个getFruitBasket
方法而不是getApples
and的原因getOranges
,以最大限度地减少从我的应用程序调用OrchardGate
.
Apple
在成功检索对象和对象的情况下Orange
,没有问题,我可以直接返回FruitBasket
. 如果访问 或 内部或两者OrchardGate
中出现问题,我还可以通过抛出 的后代(或者甚至是,如果我将其添加到适当的子句中)来处理此问题。AppleTree
OrangeTree
RuntimeException
Exception
getFruitBasket
throws
然而,在部分成功的情况下会发生什么呢?如果我可以正常访问服务器,但由于 和 之间的某些传输问题而无法AppleTree
访问服务器,会发生什么情况?OrangeTree
OrchardGate
OrangeTree
据我所知,只有四种选择,而且都非常可怕:
Apple
成功接收了对象,也FruitBasket …
我有一个非常简单的集成流程,其中RESTful请求使用发布 - 订阅通道转发给两个提供者.然后,将两个RESTful服务的结果聚合在一个阵列中.整合流程的草图如下所示:
@Bean
IntegrationFlow flow() throws Exception {
return IntegrationFlows.from("inputChannel")
.publishSubscribeChannel(s -> s.applySequence(true)
.subscribe(f -> f
.handle(Http.outboundGateway("http://provider1.com/...")
.httpMethod(HttpMethod.GET)
.expectedResponseType(ItemDTO[].class))
).subscribe(f -> f
.handle(Http.outboundGateway("http://provider2.com/...")
.httpMethod(HttpMethod.GET)
.expectedResponseType(ItemDTO[].class)
)
)
)
.aggregate()
.get();
}
Run Code Online (Sandbox Code Playgroud)
但是,在运行我的代码时,结果数组包含仅由一个RESTful服务返回的项.我缺少任何配置步骤吗?
UPDATE
考虑到Artem的评论,以下版本对应于完整的解决方案.
@Bean
IntegrationFlow flow() throws Exception {
return IntegrationFlows.from("inputChannel-scatter")
.publishSubscribeChannel(s -> s.applySequence(true)
.subscribe(f -> f
.handle(Http.outboundGateway("http://provider1.com/...")
.httpMethod(HttpMethod.GET)
.expectedResponseType(ItemDTO[].class))
.channel("inputChannel-gather"))
.subscribe(f -> f
.handle(Http.outboundGateway("http://provider2.com/...")
.httpMethod(HttpMethod.GET)
.expectedResponseType(ItemDTO[].class))
.channel("inputChannel-gather")))
.get();
}
@Bean
IntegrationFlow gatherFlow() {
return IntegrationFlows.from("inputChannel-gather")
.aggregate(a -> a.outputProcessor(g -> new GenericMessage<ItemDTO[]>(
g.getMessages().stream()
.flatMap(m -> Arrays.stream((ItemDTO[]) m.getPayload()))
.collect(Collectors.toList()).toArray(new …
Run Code Online (Sandbox Code Playgroud) aggregator ×4
java ×2
aggregation ×1
asp.net ×1
c# ×1
dsl ×1
events ×1
partial ×1
slickgrid ×1
sum ×1