问题标签 [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.
c# - MediatR 和 NInject 中的单个实例
在我的应用程序(带有 NInject 的 MVC)的引导程序中,我将这两个请求绑定到我的服务:
在服务中,我有
但由于 MediatR 创建了一个新实例,MyService
当我取回消息时,列表为空:
有没有办法强制 MediatR 对每个请求使用相同的实例?
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 继承时,我遇到了同样的问题。在那种情况下,网络共识似乎说是务实的,继续前进,让轻微的污染可以省去很多麻烦。这是另一个类似的案例吗?我不介意为了实用主义而牺牲纯洁,但不仅仅是为了懒惰。
这是我使用的其他软件包会出现的一个基本问题,所以我期待解决这个问题。
谢谢!
c# - MediatR 和 SelectList(以及其他“填充非命令数据”)
在 ASP.NET Core 中使用 MediatR。我有一个用于编辑用户的命令。命令中的属性之一基于SelectList
具有从数据库中提取的值的下拉列表。
只是好奇,人们通常会为此做什么?您是否将SelectList
orIEnumerable<T>
作为命令的一部分?这似乎是错误的,因为它实际上不是命令的一部分......但我希望控制器是干净的并且只有调解器。在控制器中发送调用并处理响应。我真的不想在 GET 和 POST 上的 Handler 之外进行数据库调用(例如,如果验证失败)。
我很好奇人们在这种情况下会做什么,在这种情况下,你有不可编辑的数据,这些数据相关但不属于你的命令的一部分?我还没有真正看到任何涵盖此类场景的 MediatR 示例。
c# - MediatR 共享 TableBatchOperation 以在不同的处理程序中进行事务保存
我搜索了如何在多个 Handler 之间共享 TableBatchOperation Azure 表存储,以进行事务行为。
在 CQRS 场景中,我会在 Azure 表存储中进行多次插入,但是对于像 MediatR 这样的总线内存,如果此插入在不同的处理程序中,如果一个失败但另一个失败,则很难。
我认为如果我在 publish() 调用方法之前和之后共享一个 TableBatchOperation 就可以了。
有这样做的建议吗?
c# - 有一个同步处理程序和一个异步处理程序
请看下面的同步代码:
以及下面的调用代码:
这按预期工作。请看下面的异步代码:
以及下面的调用代码:
此代码按预期工作。
同一个类(Person)是否可以有两个处理程序,即一个同步和另一个异步?mediator.Send(new Person());
如果我将两个处理程序类都放在我的代码中,那么这两个 mediator.send行即Task.Run(() => mediator.Send(new Person()));
调用同步方法。
我如何告诉 mediatr,使用哪个处理程序类?即用于同步调用的 PersonHandler 和用于异步调用的 PersonHandlerAsync。
c# - 使用 Autofac 和 MediatR 添加通用装饰器
我能够让我的命令和查询与它们各自的处理程序一起正常工作,但装饰器却没有。
我正在将 Autofac 与 MediatR 一起使用。一个复杂的问题是我的消息(命令/查询/事件)在一个单独的项目中,因此需要通过 Autofac 的程序集进行注册。
这是我的 CommandHandler 接口:
一个示例 CommandHandler:
我的装饰器:
还有我的部分配置:
关于让装饰器处理程序触发的任何想法?如前所述,命令和查询运行良好。
跟进:开放泛型和装配扫描
MediatR Git 页面上有讨论 Autofac、Open Generics 和 Assembly 扫描的困难:
https://github.com/jbogard/MediatR/issues/128
在进行程序集扫描时,Autofac 似乎不支持注册开放的泛型......
我知道这个问题,但在我看来这不是一个因素。我知道程序集扫描和注册是成功的,因为命令处理程序已正确注册。还是我忽略了什么?
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
谢谢!
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 中的错误。谢谢。
c# - Mediatr 行为管道中的验证
我将 Mediatr 4 与我的 web api 2 项目一起使用。连同 FluentValidation 和 Unity,我一直在添加管道行为来验证我的请求。
这一切都很好,但我真的希望能够在一个完整的响应中返回验证。我正在努力做出这样的改变,要么让它编译,要么没有 Unity throw runtime 解决问题。
我想有类似的东西:
在此基础上,我在行为中添加了一个约束,如下所示:
但是尝试返回 CommandResult 而不是抛出异常会给我带来类型转换问题,感觉就像我把它弄得太复杂了,而且我错过了一些非常基本的东西。
c# - 使用 MediatR 时可以让一个处理程序调用另一个处理程序吗?
或者这被认为是不好的做法还是什么?
我有一个通知触发 4-5 个处理程序,这些处理程序又调用数据库来检索数据。每个这些调用也可以单独调用,因此它们本身就是请求/处理程序。
谢谢。