使用 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的主要内容,如果未能解决你的问题,请参考以下文章