使用 ServiceStack 设置 MediatR
Posted
技术标签:
【中文标题】使用 ServiceStack 设置 MediatR【英文标题】:Setting up MediatR with ServiceStack 【发布时间】:2021-11-06 16:47:13 【问题描述】:可能我弄错了,但这里是ServiceStacks 容器配置中的MediatR 注册:
public override void Configure(Container container)
SetConfig(new HostConfig DebugMode = true );
var mediator = new Mediator(x => x.CreateInstance());
container.Register<IMediator>(mediator);
// This resolves
var mediatorInstance = container.Resolve<IMediator>();
container.Register(c => new MyService(mediatorInstance));
如果调用了ServiceStack API服务方法
_mediator.Send(command);
然后返回错误:
"ErrorCode": "MemberAccessException", "Message": "Cannot create an abstract class."
这行似乎是原因:
var mediator = new Mediator(x => x.CreateInstance());
MediatR 具有针对不同容器的扩展库,但不针对 ServcieStack(FunQ 或 SimpleContainer)。 所以我不知道如何正确设置MediatR。
目前我正在使用带有 .NET Framework 4.5 的 ServiceStack v5.10.4(最新:5.12.0)和 MediatR v5.1.0(最新:9.0.0)。
【问题讨论】:
【参考方案1】:由于 MediatR 有一个 example for ASP.NET Core's IOC,我会坚持使用它,即:
如果您使用的是 ASP.NET Core,那么您可以跳过配置并使用 MediatR 的 MediatR.Extensions.Microsoft.DependencyInjection 包,其中包含一个 IServiceCollection.AddMediatR(Assembly) 扩展方法,允许您在其中注册所有处理程序和前/后处理器给定的程序集。
public void ConfigureServices(IServiceCollection services)
services.AddMvc();
services.AddMediatR(typeof(Startup));
ServiceStack 的 IOC 将 automatically fallback 解析 ASP.NET Core 的 IOC 中的任何依赖项。
【讨论】:
能否应用于 WPF 应用中的自托管 ServiceStack? @JPollack ASP.NET Core 的 IOC 仅在 ASP.NET Core 应用程序中可用。如果您需要在 .NET Framework 上运行,则需要使用仅限 ASP.NET Core 2.1 的 ASP.NET Core on .NET Framework。 很高兴知道。那么在 WPF 项目中不能在 .NET Framework 4.5 上将 MediatR 与自托管 ServiceStack 一起使用? @JPollack 如果这是一个正常的依赖项,您可以像其他任何人一样注册和解决它,我自己从未使用过它,但从他们的registration docs 看来它需要依赖IOC 的程序集扫描功能,因此您可能需要使用one of their supported IOCs。在像 ServiceStack 这样的基于消息的 fx 中使用 MediatR 是否有意义?你知道Service Gateway吗? 不,我不知道服务网关。这看起来很有希望使用进程内消息将 Web 服务与业务逻辑分离。以上是关于使用 ServiceStack 设置 MediatR的主要内容,如果未能解决你的问题,请参考以下文章
是否可以将ServiceStack.Text.JsConfig设置范围仅限于您的库?
ServiceStack NetCoreAppSettings 配置文件读取和设置
ServiceStack 文本设置以在反序列化 json 时推断原始值类型