问题标签 [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 和 SimpleInjector 的依赖范围问题
我一直在使用 Entity Framework 进行数据访问的 WinForms 应用程序中使用MediatR库来试验中介者模式和 CQRS。该应用程序用于批量制造工厂,允许用户查看活动和已完成批次的列表,并在必要时更新批次信息。每个批次都有大量与之相关的信息,例如质量和过程测量。根据这些文章,读取和写入数据被组织成查询和命令:
带有 MediatR 和 AutoMapper 的 CQRS
这是一个查询和查询处理程序的简单示例。DataContext
使用 SimpleInjector 注入到查询处理程序中。
这将从演示者处调用,如下所示:
我遇到的问题是 DbContext 的生命周期。理想情况下,我想为每个隔离事务使用一个实例,在这种情况下将包括以下内容:
- 从数据库中检索批次列表
- 检索批次的质量指标列表(这些指标存储在不同的数据库中并通过存储过程访问)
- 更新批次,可能包括更新数据库中的多个实体
这将引导我走向 DbContext 的范围或短暂的生活方式。但是,当使用瞬态生活方式时,SimpleInjector 会引发以下错误,注册类型时会抛出如下错误:
SimpleInjector.dll 中出现“SimpleInjector.DiagnosticVerificationException”类型的未处理异常
附加信息:配置无效。报告了以下诊断警告:
-[Disposable Transient Component] DataContext 注册为瞬态,但实现了 IDisposable。
在 SimpleInjector 网站上研究这个问题会发现以下注释:
警告:容器不跟踪瞬态实例。这意味着 Simple Injector 不会处理瞬态实例。
这使我走上了为 DataContext 使用 Lifetime Scope 生活方式的道路。为此,我为我的查询创建了一个新的装饰器类,并将其注册如下:
但是,进行该更改会导致不同的异常,这次在以下行中引发:
MediatR.dll 中出现“System.InvalidOperationException”类型的未处理异常
附加信息:未找到 MediatorTest.GetAllBatchesQuery 类型请求的处理程序。
容器或服务定位器未正确配置或处理程序未在您的容器中注册。
在调试并查看 MediatR 代码后,似乎在调用该方法时,通过调用创建了mediator.Send(...)
一个新的类实例。但是,由于此时不在执行范围内,因此可能没有正确初始化,导致异常。GetAllBatchesQueryHandler
container.GetInstance()
DataContext
我相信我了解问题的根本原因,但不知道如何有效地解决它。为了更好地说明这个问题,我开发了以下最小示例。任何实现的类IDisposable
都会导致我遇到的相同问题DataContext
。
c# - LightInject 不解析继承的泛型类型
我正在尝试使用 LightInject 和 MediatR 来构建通用请求处理程序。基本上,我有以下类型:
我已经将我的Handler
类型注册到我的 LightInject 容器中,如下所示:
但是,当我尝试调用我的调解器以实现 时IAsyncRequestHandler<InheritedType,SomeResponseType>
,它失败了。我本来希望得到我的注册Handler
,因为InheritedType
implements SomeType
。
我在这里做错了什么,或者 LightInject 有什么方法可以实现我上面描述的行为?
如果不清楚,请告诉我,我可以尝试提供更多信息。谢谢!
c# - 在 LINQ 中过滤 ProjectToList
我正在使用 MediatR 请求 AvisualizationDto
这些直接从DbContext
. 现在的问题是ProjectToList<>
递归映射。在关卡中有一个缓冲区列表,在每个缓冲区中都有一个堆栈列表。现在我只需要映射 TimeOut 值为 null 的堆栈。我不想在映射后过滤所有内容,因为这可能会减慢速度。我试过了
但是我收到的值不是过滤后的值,仍然是完整的数据集。有没有其他方法可以过滤 a ProjectToList
?
现在我有一个看起来像的输出
我需要过滤掉已经完成的堆栈,以便那些没有 TimeOut 为空的堆栈。
c# - 使用 WebApi、SimpleInjector 和 MediatR 时正确设置 Scope
控制器
在 Get() 操作的第一次请求中,处理程序由 SimpleInjector 实例化并正确执行。
在第二个请求中(例如浏览器中的 F5),它失败并显示:
未找到类型请求的处理程序 ....
容器或服务定位器未正确配置或处理程序未在您的容器中注册。
和内部例外:
无法访问已处置的对象。
对象名称:'ThreadLocal 对象已被释放。'
欧文启动
WebAPI 项目的 SimpleInjector IPackage
我认为正在发生的事情是正确创建了处理程序,然后在第一次请求后处置。现在,我不知道为什么,但是在后续请求中,不会重新创建处理程序。我知道这一点,因为如果我将 WebApiRequestLifestyle 更改为“范围结束时不处理”,它适用于每个请求:
问题
- 我应该将
disposeInstanceWhenScopeEnds
参数设置为 false 吗? - 如果不是,正确的解决方案是什么?
- 我看到这已经通过创建 LifetimeScopeDecorator 解决了......但是,这个功能肯定已经由 SimpleInjector WebApi 集成库提供了吗?我错过了什么?
(感谢您的阅读)
c# - Autofac 在封闭类型上应用通用装饰器无法正常工作
使用 Autofac 3.5 和 MediatR,我试图将装饰器应用于实现特定接口的封闭类型。我有以下处理程序类型:
我想将以下通用开放装饰器类型应用于所有实现 IRequestHandler<,> 的类型:
我的 Autofac 配置是:
封闭类型被注入,但从未用 LoggingHandler 修饰。我不知道我在这里缺少什么,根据如何在 Autofac 中为开放的通用注册注册一个开放的通用装饰器尝试了几种方法?或AutoFac - 为一些开放的泛型注册装饰器,但对我没有用。
c# - 使用 Mediatr 和 Unity 进行 FluentValidation
我正在尝试在 WebApi 项目(不是 asp.net Core)中使用 FluentValidation。
我有以下代码:
我正在扫描程序集并注册验证器,其中现在只有一个,它位于此处:(不要介意奇怪的验证,我正试图让它失败)
我的 Application_start 看起来像这样:
我有以下验证器工厂:
现在; 当我在控制器上调用操作时,“CreateInstance”尝试解析类型的验证器类型:
代替:
当然什么也没找到,这意味着我的验证没有运行。
有没有人知道为什么会这样?看起来很简单,所以我很难看出哪里出了问题。
c# - 使用 Autofac 解决 IEnumerable
我正在尝试使用 Mediatr 和 Autofac 构建调解器管道,但正在努力解决来自 Autofac 的验证器集合。
当我放入IValidator<TRequest>
构造函数时,它可以很好地解决,但是当我放入IEnumerable<IValidator<TRequest>>
它时,它会失败,除了:
容器或服务定位器未正确配置或处理程序未在您的容器中注册。---> Autofac.Core.DependencyResolutionException:在激活特定注册期间发生错误。
这是我的注册码:
我用这个替代注册得到了同样的结果:
任何建议都非常感谢!
dryioc - DryIOC 和 MediatR:对 IAsyncNotificationHandler 和 IAsyncRequestHandler 使用 InResolutionScopeOf 进行注入
这个问题是我之前的问题DryIOC Decorator 和 InResolutionScopeOf的后续问题
我要做的是在 IAsyncRequestHandler 和 IAsyncNotificationHandler 的解析范围内创建 EF DbContext 实例,这意味着注入请求中的上下文不能与注入通知(从请求中发布)中注入的上下文相同。由于通知是从请求处理程序内部发布的,因此这种嵌套给我想要的设置带来了一些麻烦。
值得注意的是,在给定的 IAsyncRequestHandler 或 IAsyncNotificationHandler 实例中注入的每个 DbContext 在它们自己的装饰器中都需要相同。
我创建了一个 dotnetfiddle 并尝试设置它https://dotnetfiddle.net/KiFCHY。(我在这个例子中省略了装饰器)
它包含一个 RequestHandler,它在被调用时打印一条消息,然后它发布一个通知,该通知打印另一条消息。但是,如您所见,未调用通知是因为 MediatR 无法获取 IAsyncNotificationHandler 实例(因为它无法解析 DbContext)。
这种设置可以吗?
谢谢
dryioc - DryIOC,MediatR - DecoratorWith 条件使用键控参数多次评估
这个问题是上一个关于使用 MediatR 和装饰器设置 DryIOC 的问题的又一个后续问题:DryIOC 和 MediatR:使用 InResolutionScopeOf 进行 IAsyncNotificationHandler 和 IAsyncRequestHandler 注入
在这个例子中,设置类似于我之前的问题,我们有请求 (IAsyncRequestHandler) 和通知 (IAsyncNotificationHandler),并且通知是从请求中触发的,并且两者都依赖于 DbContext,需要每个分辨率范围注入。
我现在正在做的是装饰 IAsyncRequestHandler 并且我正在使用一个键将 IActionHandler 类型的依赖项传递给装饰器。我正在注册这样的依赖项:
然后,像这样将参数传递给装饰器:
像这样设置,通知从请求处理程序成功触发。但是,如果我添加更多装饰器并将装饰器的设置参数更改为 DecoratorWith 并指定一个条件(即使它只是返回 true),则不会从请求处理程序中触发通知,因为 DbContext 未成功注入 IAsyncNotificationHandler .
这是一个显示问题的小提琴https://dotnetfiddle.net/ob0nfA
调试的时候发现第一个装饰器的DecoratorWith中的条件对于同一个服务类型被调用了两次,当有两个注册时。我不确定这是否是有意的,但是我相信这可能与问题有关,因为如果我只是返回 true,那么将为同一个处理程序注册多个装饰器,而应该只有一个。
我知道我可以使用 Made 来注册装饰器依赖项,但在这个特定的实例中,键控注册似乎更适合我的预期设置。所以我想知道我是否缺少某些东西,或者如果 DecoratorWith 为同一服务类型被多次调用而按预期工作,我想知道是否有一种方法可以区分调用,以便我只能正确注册一次装饰器。或者问题可能完全出在其他地方。
谢谢
c# - Mediatr 3.0 使用管道行为进行身份验证
查看使用新的 Mediatr 3.0 功能管道行为进行身份验证/授权。
您通常会根据消息或处理程序进行身份验证吗?我问的原因是我会在处理程序上进行身份验证(与 MVC 中的控制器相同),但行为似乎并不了解处理程序,所以我不确定这是可能/合适的。
我可以为每条消息添加一个 IAuthorisationRequired 标记接口,但如果该消息是通知/事件并且有多个处理程序,那么可能有些应该运行,但其他的不应该运行。在执行实际工作的处理程序代码上检查身份验证确实感觉更好。
希望能够将 [Authorize] 属性放在处理程序上并使用行为来检查它(我目前正是这样做的,但是使用基类而不是行为)。