问题标签 [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# - 读取端数据库最终与事件处理程序保持一致。如何分段读取端更新
我已经实现了一个事件存储系统,其中我的根聚合以仓库为模型。我有一些事件BoxCreated
,BoxLocationChanged
例如。这两个事件都有单独的事件处理程序来更新读取侧表dbo.Boxes
。
然而,我现在已经到了这两个处理程序都需要更新另一个读取端数据库的地步,该数据库dbo.BoxType
跟踪每个盒子类型的库存状态和位置。
我的问题是我是否应该为这些新的读取端更新创建一个单独的事件处理程序(使用相同的事件),还是应该将另一个存储库注入当前事件处理程序并在同一个事件处理程序中处理所有读取端更新?
哪个是首选的设计选择?选择是否取决于我未列出的其他因素?
为了演示,使用 MediatR,我目前有如下事件处理程序:
如果您可以为我指出如何处理读取端更新失败的正确方向,则可以加分。
谢谢!
asynchronous - 重建读取端 DB 时事件乱序
我有一个事件源系统,我现在正在实现一个端点,它将从事件存储事件重建读取端数据存储。但是,我现在在处理事件的方式上遇到了似乎是并发问题。
我决定在重建期间使用我的事件处理程序代码来处理事件。在系统的正常状态下(不是读取端数据库重建),我的事件处理程序侦听他们订阅的事件并相应地更新预测。但是,当通过它们的事件处理程序在线处理这些事件时,我看到读取端数据库最终状态的结果不一致(如果它甚至到达那里,它有时不会)。我想这意味着他们执行不正常。
我不应该以这种方式使用事件处理程序吗?我想既然我正在处理事件,那么以这种方式重用事件处理程序是非常合适的。
我正在使用MediatR进行服务消息传递。所有事件处理程序都实现INotificationHandler
.
这是代码示例:
我已经尝试用await
调用来替换关键字Wait()
。
类似的东西_mediator.Publish(bcc).Wait()
。但这似乎不是一个好主意,因为这背后有异步代码。而且也没用。。
我还尝试对事件版本进行排队,并让事件类型案例等到它们的版本位于队列顶部,然后再发布事件。
就像是:
这也没有奏效。
无论如何 - 如果有人对如何处理这个问题有任何想法,我将非常感激。我不希望以同步方式复制所有异步事件处理程序代码。
asp.net-core - 在 Clean Architecture 中处理响应代码决策的层
目前使用 MediatR 实施 Clean Architure
现在实现在业务逻辑层、基础设施和控制器之间分离,它们依赖于依赖注入和解耦。
目前实现在 Asp.Net Core 中,该框架支持在控制器中完成响应代码生成,如下例所示。
我想知道 Clean Architecture 层应该在哪里将业务规则决策转换为正确的响应代码,以及进行这种适应的良好实践或设置方法。似乎快速实现仍然会在控制器中执行,但是想知道这个决定是属于业务规则还是应用程序业务规则,并且应该在转换为表示层的响应代码之前在不同的层中处理。如果那时 Asp.Net 核心或 MediatR(或任何其他库)具有支持此类设计的内置框架或功能。
asp.net-web-api - 多层授权
我正在使用 ASP.NET Core 和 MediatR 构建应用程序/Web API。
身份验证(Google 帐户)在 ASP.NET Core 中完成。控制器只创建一个薄层,将所有工作委托给 MediatR 及其请求处理程序。
关于授权,目前,我的方法是,如果用户已通过身份验证,我的大多数控制器都装饰有 [Authorize] 属性以及 MediatR 管道检查(通过行为)中的相应请求处理程序,因此存在重复性。
我的问题是,让所有控制器都允许匿名访问并且只检查 MediatR 管道中的身份验证/授权是一种不好的做法吗?
当然,我需要将它保存在请求处理程序中,因为它们正在形成实际的应用程序层,并且我希望它独立于 ASP.NET。也只测试了这一层。
c# - MediatR 行为的约束违反异常
我将MediatR与以下类一起使用:
其中 Envelope 是一个包装类:
由中介发送的 GetPostsRequest 由 Handler 执行:
MediatR 允许使用在特定请求的处理程序之前执行的行为。我创建了一个ValidationBehavior如下:
我在 ASP.NET Core 应用程序上注册了 ValidationBehavior:
当我调用 API 时,出现以下错误:
我错过了什么?
c# - 使用 MediatR 和 Autofac 的组件注册问题
我正在使用 Autofac 和 MediatR 构建基于 CQRS 的 .Net Core 2.1 应用程序。
当我将命令提供给调解器时,它工作得很好,并且命令处理程序上的 Handle() 被执行。
当我以这种方式执行时,事情并不顺利
例外:
2[Backend.MessageService.Commands.IdentifiedCommand
未处理的异常:System.InvalidOperationException:为 MediatR.IRequestHandler 2[Backend.MessageService.Commands.CreateMessageCommand,System.Boolean],System.Boolean]类型的请求构造处理程序时出错。向容器注册您的处理程序。有关示例,请参阅 GitHub 中的示例。---> Autofac.Core.Registration.ComponentNotRegisteredException:请求的服务'MediatR.IRequestHandler2[[Backend.MessageService.Commands.IdentifiedCommand
2[[Backend.MessageService.Commands.CreateMessageCommand,Backend.MessageService,版本=1.0.0.0,文化=中性,PublicKeyToken=null],[System.Boolean,System.Private.CoreLib,版本=4.0.0.0,文化=中性, PublicKeyToken=7cec85d7bea7798e]], Backend.MessageService, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Boolean, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e ]]' 尚未注册。要避免此异常,请注册一个组件以提供服务,使用 IsRegistered() 检查服务注册,或使用 ResolveOptional() 方法解决可选依赖项。
我可以知道缺少什么吗?
c# - 如何在 asp.net core 2.0 IHostedService 中注入 autofac 依赖项
我正在开发 asp.net core 2.0 webapi 并想要一个后台任务来处理来自 kafka 消息总线的消息。我阅读了一些关于 IHostedService 的文档并创建了一个自定义后台服务。我正在使用 MediatR 实施 CQRS。
我已经在 Autofac 中注册了 MediatR 模块。我需要 Meditatr 对象在自定义托管服务中可用。谁能帮我实现这一目标?
autofac.json
Autofac模块:
程序.cs
公共类程序 { public static void Main(string[] args) { BuildWebHost(args).Run(); }
}
启动.cs
后台服务
谢谢
c# - 无法使 Autofac 嵌套范围工作(嵌套的多个工作单元应该有一个新的 dbcontext )
我正在尝试使用 Autofac 和 Mediatr 实现工作单元。这里的流程如何
但我无法让 Autofac 在范围内发送相同的 Unit OfWork 实例(以 DbContext 作为参数)。我想在单个事务中执行整个范围,这意味着当我到达 processHandler 点时,它应该创建一个 DbContext 实例并将同一个实例共享到嵌套处理程序中。这样我就可以在 processhandler 级别创建事务并将相同的事务共享给嵌套处理程序。
这是我的 DI 设置
上面一个是进程处理程序
以上是嵌套处理程序的示例。我想要来自 processhandler 的相同 _uow 实例。
EFUNItOFWork 看起来像
我究竟做错了什么 ?
谢谢你。
c# - 如何将 FluentValidation 库与 MediatR IPipelineBehavior 一起使用?
我开始探索MediatR,但是当从 Postman 调用 GET 端点时遇到问题,API 返回 500 Internal Server Error。而且,我认为 FluentValidation 的实现pipeline
导致了这个问题。也许,我的实现不正确或者我可能误解了。这是代码,请有人看一下!
来自控制器的代码。
处理程序代码。
请求和响应代码。
FluentValidation Pipeline 的代码。
像这样注册管道Startup.cs
:
当我执行命令时,出现以下错误。
请注意,当我在中分离 FluentValidation 管道时,startup.cs
我没有遇到问题,但当然,该Post
方法不会进行验证。
c# - 如何使用 Autofac 注册调解员的 IPipelineBehavior
我正在尝试了解如何使用调解器设置管道行为。
我的命令:
我的处理程序:
现在,假设我想处理 RequestHandlers 中引发的所有异常,这些异常CommandResult
通过记录它们并在我的CommandResult
对象中返回消息来返回 a 。我创建了这个类:
我需要在我的控制反转容器 (AutoFac) 中放入什么?