使用 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 时推断原始值类型

使用 ServiceStack 使用 REST Web 服务时的用户身份验证

ServiceStack 示例应该以啥顺序被理解?

具有多个数据库服务器的 ServiceStack OrmLite