问题标签 [mediatr]

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 回答
1088 浏览

c# - MediatR 和 NInject 中的单个实例

在我的应用程序(带有 NInject 的 MVC)的引导程序中,我将这两个请求绑定到我的服务:

在服务中,我有

但由于 MediatR 创建了一个新实例,MyService当我取回消息时,列表为空:

有没有办法强制 MediatR 对每个请求使用相同的实例?

0 投票
6 回答
7042 浏览

c# - DDD:从域项目中引用 MediatR 接口

我刚刚开始使用 DDD。我正在将域事件放入 CQRS 应用程序中,并且遇到了一项基本任务:如何在域项目中使用 MediatR.INotification 标记接口而不创建对基础结构的域依赖。

我的解决方案分为四个项目,如下所示:

我目前在 UI 项目中安装了 MediatR 和 MediatR .net Core DI 包,并使用 .AddMediatR() 使用命令将它们添加到 DI

它从 AppServices 项目中扫描并注册命令处理程序。

当我想定义一个事件时,问题就来了。为了让 MediatR 处理我的域事件,它们需要使用 MediatR.INotification 接口进行标记。

在这种情况下标记我的事件以便 MediatR 可以使用它们的正确方法是什么?我可以为事件创建自己的标记界面,但如果没有某种方式将它们自动转换为 MediatR.INotification,MediatR 将无法识别它们。

这只是使用多个项目的缺点吗?但是,即使我使用的是单个项目,如果我在域部分中使用 MediatR.INotification,我也会在域中放置一个“外部”接口。

当我的用户实体从 EF 的 IdentityUser 继承时,我遇到了同样的问题。在那种情况下,网络共识似乎说是务实的,继续前进,让轻微的污染可以省去很多麻烦。这是另一个类似的案例吗?我不介意为了实用主义而牺牲纯洁,但不仅仅是为了懒惰。

这是我使用的其他软件包会出现的一个基本问题,所以我期待解决这个问题。

谢谢!

0 投票
0 回答
178 浏览

c# - MediatR 和 SelectList(以及其他“填充非命令数据”)

在 ASP.NET Core 中使用 MediatR。我有一个用于编辑用户的命令。命令中的属性之一基于SelectList具有从数据库中提取的值的下拉列表。

只是好奇,人们通常会为此做什么?您是否将SelectListorIEnumerable<T>作为命令的一部分?这似乎是错误的,因为它实际上不是命令的一部分......但我希望控制器是干净的并且只有调解器。在控制器中发送调用并处理响应。我真的不想在 GET 和 POST 上的 Handler 之外进行数据库调用(例如,如果验证失败)。

我很好奇人们在这种情况下会做什么,在这种情况下,你有不可编辑的数据,这些数据相关但不属于你的命令的一部分?我还没有真正看到任何涵盖此类场景的 MediatR 示例。

0 投票
1 回答
518 浏览

c# - MediatR 共享 TableBatchOperation 以在不同的处理程序中进行事务保存

我搜索了如何在多个 Handler 之间共享 TableBatchOperation Azure 表存储,以进行事务行为。

在 CQRS 场景中,我会在 Azure 表存储中进行多次插入,但是对于像 MediatR 这样的总线内存,如果此插入在不同的处理程序中,如果一个失败但另一个失败,则很难。

我认为如果我在 publish() 调用方法之前和之后共享一个 TableBatchOperation 就可以了。

有这样做的建议吗?

0 投票
1 回答
8852 浏览

c# - 有一个同步处理程序和一个异步处理程序

请看下面的同步代码:

以及下面的调用代码:

这按预期工作。请看下面的异步代码:

以及下面的调用代码:

此代码按预期工作。

同一个类(Person)是否可以有两个处理程序,即一个同步和另一个异步?mediator.Send(new Person());如果我将两个处理程序类都放在我的代码中,那么这两个 mediator.send行即Task.Run(() => mediator.Send(new Person()));调用同步方法。

我如何告诉 mediatr,使用哪个处理程序类?即用于同步调用的 PersonH​​andler 和用于异步调用的 PersonH​​andlerAsync。

0 投票
0 回答
1666 浏览

c# - 使用 Autofac 和 MediatR 添加通用装饰器

我能够让我的命令和查询与它们各自的处理程序一起正常工作,但装饰器却没有。

我正在将 Autofac 与 MediatR 一起使用。一个复杂的问题是我的消息(命令/查询/事件)在一个单独的项目中,因此需要通过 Autofac 的程序集进行注册。

这是我的 CommandHandler 接口:

一个示例 CommandHandler:

我的装饰器:

还有我的部分配置:

关于让装饰器处理程序触发的任何想法?如前所述,命令和查询运行良好。

跟进:开放泛型和装配扫描

MediatR Git 页面上有讨论 Autofac、Open Generics 和 Assembly 扫描的困难:

https://github.com/jbogard/MediatR/issues/128

在进行程序集扫描时,Autofac 似乎不支持注册开放的泛型......

我知道这个问题,但在我看来这不是一个因素。我知道程序集扫描和注册是成功的,因为命令处理程序已正确注册。还是我忽略了什么?

0 投票
1 回答
5059 浏览

c# - 仅为特定接口类型(命令)执行 MediatR 预处理器

[注意:这是一个“替换”问题。第一个是基于我的主要项目的代码,所以我用来自单一用途项目的代码重做了这个问题,更清楚地说明了原理。问题保持不变,只是更好地提出。]

情景

我正在尝试使用 MediatR 管道行为和 Autofac 在 CQRS 请求管道上设置命令预处理器以进行请求路由。我的目标是让预处理器只为命令 (ICommand<>) 而不是所有请求 (IRequest<>) 运行,这将导致预处理器执行命令、查询和事件。

问题

我可以让我的 GenericPreProcessor 或任何其他预处理器对所有类型的请求运行良好,但是我用来尝试“过滤”注入的任何方法要么返回错误,要么根本不执行所需的预处理器.

我在 Autofac 中为所有请求工作的管道配置如下所示:

从概念上讲,我正在尝试做任何类似的事情,但失败了:

我正在为 MyCommandPreProcessor 尝试几种不同的配置,一个通用的和一个非通用的,但我被以下任何一个难住了:

我的问题

关于如何注册一个预处理器的任何想法,该预处理器将被限制为仅针对 ICommand<> 的封闭类型的 IRequest<> 类型触发?

辅助材料

GitHub上的项目

整个最小示例项目可以在https://github.com/jhoiby/MediatRPreProcessorTest查看或克隆

Autofac MediatR 配置

一个工作配置,所有请求都有一个 GenericRequestPreProcessor。

MyCommandPreProcessor 类

我正在试验这两种,通用的和非通用的:

继承结构

命令

命令处理程序

预处理器注入目标(在 MediatR 管道代码中)

接收注入的 IRequestPreProcessor<> 的构造函数是:

可以在 Github 上文件的第 17 行看到:

https://github.com/jbogard/MediatR/blob/master/src/MediatR/Pipeline/RequestPreProcessorBehavior.cs

谢谢!

0 投票
0 回答
628 浏览

autofac - 使用 MediatR 和 Autofac ContravariantRegistrationSource 的多个通知

我正在尝试使用 MediatR 设置通用通知,但通知处理程序被多次调用。

https://github.com/smartaypants/MediatR/blob/master/test/MediatR.Tests/CustomNotificationTests.cs

该测试发布了一个实现 ICustomNotification 的 CustomNotification。CustomNotificationHandler 被限制接受必须实现 ICustomNotification 的 TNotification。

我希望这只会被调用一次,但处理程序被调用了 3 次 - 其中 TNotification 是 CustomNotification、CustomNotificationBase 和 ICustomNotification - 但它们都是同一个实例......这应该发生吗?

如果我从 Autofac 注册中删除了 ContravariantRegistrationSource 行,那么它会按预期工作。同样,如果我使用 StructureMap 注册它工作正常。

我不完全明白为什么我需要启用逆变。我只使用这一行,因为它包含在 MediatR wiki 以及我能找到的几乎所有示例中。

请有人可以解释为什么会发生这种情况,如果我做错了什么,或者它是 Autofac 中的错误。谢谢。

0 投票
2 回答
2941 浏览

c# - Mediatr 行为管道中的验证

我将 Mediatr 4 与我的 web api 2 项目一起使用。连同 FluentValidation 和 Unity,我一直在添加管道行为来验证我的请求。

这一切都很好,但我真的希望能够在一个完整的响应中返回验证。我正在努力做出这样的改变,要么让它编译,要么没有 Unity throw runtime 解决问题。

我想有类似的东西:

在此基础上,我在行为中添加了一个约束,如下所示:

但是尝试返回 CommandResult 而不是抛出异常会给我带来类型转换问题,感觉就像我把它弄得太复杂了,而且我错过了一些非常基本的东西。

0 投票
1 回答
5168 浏览

c# - 使用 MediatR 时可以让一个处理程序调用另一个处理程序吗?

或者这被认为是不好的做法还是什么?

我有一个通知触发 4-5 个处理程序,这些处理程序又调用数据库来检索数据。每个这些调用也可以单独调用,因此它们本身就是请求/处理程序。

谢谢。