问题标签 [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 投票
1 回答
3514 浏览

mediatr - 容器中的 MediatR Autofac 处理程序注册

我在我的第一个 IMediatR、Autofac MVC 项目中遇到了一个问题。非常感谢您的帮助..提前感谢!

未找到 SliceProject.Services.Query.GetUserListQuery 类型请求的处理程序。容器或服务定位器未正确配置或处理程序未在您的容器中注册。

Autofac 容器代码:

0 投票
2 回答
7662 浏览

c# - 使用 void/Task 响应注册 MediatR 管道

我的命令:

我的处理程序:

我的管道注册(不使用开放泛型):

但是,这不起作用:Using the generic type 'IPipelineBehavior<TRequest, TResponse>' requires 2 type arguments.对于MyBehavior.

文档提到了Unitstruct。我该如何使用它?

0 投票
2 回答
2149 浏览

.net - 我应该在 Web Api Core 中测试 CQRS 处理程序还是整个请求输出

我创建 Web API 已经有一段时间了,很高兴能够测试 CQRS 处理程序(由 Mediatr 管理)而不涉及任何类型的基础设施代码(控制器、请求等)。作为我的控制器,它完全有意义非常瘦,因为他们正在做控制器应该做的事情:请求和响应之间的通信:

但仍有一些情况是我的 Handlers 测试没有涵盖的。这里有几个例子:

  1. 授权。我无法测试“错误”用户是否尝试访问特定操作,他收到拒绝访问错误。换句话说,我无法测试特定操作的授权属性。
  2. 错误处理。我可以检查我的处理程序是否在特定条件下引发了特定异常,但我无法控制基础设施(即异常中间件)如何处理此异常(即导致特定 HTTP 错误)。

ASP.NET Core 使请求输入响应输出集成测试变得非常容易(感谢 TestServer),我可以在集成测试中涵盖这两种情况。

困扰我的问题是我是否应该通过发送请求和断言响应来保持 Handlers 测试或测试操作。

我真的很喜欢 Handler 测试。它们很可爱,清晰且易于书写。测试整个请求更强大,但同时也更混乱,因为它是一种相对低级的方法,您必须处理 http 和 json。

我发现这个选择非常令人困惑,想知道推荐的方法是什么。

0 投票
0 回答
489 浏览

entity-framework-6 - 在 autofac 生命周期范围内包装 Mediatr 处理程序的创建和调用

在我的web.api应用程序中,我使用EntityFramework 6 (EF6)、MediatRAutofac。我想创建具有生命周期匹配 MediatR RequestHandlers 的 EF6 DbContext 以便我获得每个 RequestHandler 调用的工作单元。我一直在研究 Autofac 概念,如 InstancePerMatchingLifteTimeScope、Owned< Dependency >以及使用MediatR Pipeline的 MediatR 处理程序装饰。

我还没有找到任何解决方案。看来我需要将处理程序创建和处理程序调用都包装在一个用众所周知的对象标记的 AutofacLifeTimeScope 中,这样我就可以使用 InstancePerMatchingLifeTimeScope(wellknown-object) 注册 IDBContext。

也许您可以提出另一个解决方案?

0 投票
1 回答
413 浏览

asp.net-core - 访问 ControlerBase 外部操作(在 CQRS 处理程序中)

我正在将我的逻辑从 Controller 移动到 CQRS 处理程序,但我不确定如何处理调用 ControllerBase 的代码,例如:

因此,当我将这个逻辑移到行动之外时,显然我无法再访问NotFound了。我看到了多种解决方法:

  1. 改为抛出一个自定义的 NotFoundException,然后在 ExceptionMiddleware 中捕获它并在那里返回 NotFoundResult。
  2. 将 ControllerBase 注入 CQRS 命令/查询。不喜欢这个选项,因为命令/查询将与 ASP.NET Core 基础架构过于耦合。

我快速的谷歌搜索没有成功,所以我可能遗漏了一些东西。处理这种情况的推荐方法是什么?

0 投票
2 回答
7220 浏览

.net - 将 Mediatr 与 Autofac 集成

我正在使用 .NET Core(注意:不是 Web 环境)。我需要集成 MediatR 和 Autofac。

wiki 有一个指南和StructureMap 示例。另外,我已经简化了一个Autofac 示例。没有提到生命周期范围,但是在一个单独的项目中,我找到了有用的注释并将它们转换为 Autofac。有很多代码示例漂浮在各处,每个示例都不相同。

到目前为止我得到了什么:

然后注册我的自定义内容:

  • 处理程序作为瞬态,即InstancePerDependency()
  • 预处理器/后处理器按请求,即InstancePerLifetimeScope()
  • 行为是短暂的,即InstancePerDependency()

例如

然而,在我见过的大多数代码示例中,尤其是对于 StructureMap,还有大量其他注册(仅用于例如IRequestHandler<,>IRequestHandler<>IAsyncRequestHandler<,>IAsyncRequestHandler<>ICancellableAsyncRequestHandler<,>ICancellableAsyncRequestHandler<>INotificationHandler<>IAsyncNotificationHandler<>ICancellableAsyncNotificationHandler<>),而且ASP.NET Core 容器的集成也非常复杂。我没有做过类似的事情。

如果您在生产中使用此功能,那么您的配置与我的配置相比如何?谢谢!

0 投票
1 回答
1705 浏览

mediatr - 尝试将 IPipelineBehavior 与 ASP.NET Core 一起使用 - 获取 System.InvalidCastException

我正在使用 Mediatr 3 的管道行为新功能。问题是,当我将它们连接到 Mediatr 时,每次.Send()调用都会引发异常 (System.InvalidCastException)。处理程序被调用很好,但是当管道行为被调用时,它失败了。

这是我的设置:

我的行为:

当我通过调解员发送第一条消息时,我得到:

如果我为我的行为注释掉接线,我的处理程序就会被调用。应用程序的其余部分似乎工作。

我做错了什么?

0 投票
1 回答
320 浏览

mediatr - What are the upgrade steps for MediatR Dependency Injection

I took Jimmy's course which used MediatR DI 1.0.1. I'm trying to upgrade a project based on that course's examples to 2.0.0 but I can't find any upgrade steps.

Here's a specific example from the course. I've changed IAsyncRequest to IRequest and that appears to be correct. The errors remaining are for:

and

What should AsyncRequestHandler be changed to? does HandleCore need to be changed?

0 投票
1 回答
19635 浏览

c# - 使用 Moq 模拟 MediatR 3

我们最近开始使用 MediatR 来让我们在重构面向客户的大型门户并将其全部转换为 C# 时整理控制器操作。作为其中的一部分,我们也在增加我们的单元测试覆盖率,但是我在尝试模拟 MediatR 本身时遇到了问题。

该命令做了很多事情来启动一个过程,其中一部分是发送通知。通知本身由它自己的处理程序处理,因此会受到它自己的单元测试,所以我想模拟 MediatR,这样this.mediator.Send(message)调用就不会真正做任何事情。处理程序确实返回了一个对象,但在此上下文中我们并不关心它,因此出于所有意图和目的,我们将其视为void返回。我只是想验证Send作为测试的一部分已经被调用过一次。但是,该Send方法正在抛出一个NullReferenceException,我不知道为什么。

从版本 3 开始,MediatR 现在在Send、 a和表达式树上采用第二个可选参数CancellationToken,并且表达式树要求您显式设置它们,因此您必须指定一个值。我以前没有遇到过这种情况,在我看来,我觉得这可能是问题的一部分,但这可能是我的混淆。

这是一个缩小的插图。

苏特

测试

我错过了什么?我觉得我在某个地方犯了一个根本性的错误,但我不确定在哪里。

0 投票
3 回答
5518 浏览

c# - 返回带有错误的响应,而不是在验证管道 mediatr 3 中抛出异常

我目前正在使用 Mediatr 3 中的管道行为进行请求验证。如果发生任何故障,我遇到的所有示例都会抛出 ValidationException,而不是这样做,我想返回带有错误的响应。有人知道怎么做吗?

以下是验证管道的代码:

注意:我发现了这个问题使用 CQRS 处理调解器管道中的错误/异常?我对答案的第一个选项感兴趣,但没有明确的例子说明如何做到这一点。

这是我的响应类:

我在验证管道类中添加了以下签名:

然后我在 Handle 方法中这样做了:

但这给了我错误“无法转换为 TResponse”。