You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MediatR中SheetUpdatedEventHandler未触发问题求助

解决MediatR跨程序集无法触发事件处理程序的问题

问题根源

你在WebAPI项目中注册MediatR时,仅扫描了WebAPI自身的程序集(Assembly.GetExecutingAssembly()),而SheetUpdatedEventHandler位于Domain项目的程序集中,并未被MediatR扫描到,因此事件发布后没有对应的处理程序被执行。

解决方案

方案1:直接扫描Domain程序集

在WebAPI的Program.cs中,修改MediatR的注册代码,添加对Domain项目程序集的扫描。可以通过Domain项目中的任意类型获取程序集,或者直接加载程序集名称:

通过类型获取程序集(推荐,避免硬编码程序集名称)

builder.Services.AddMediatR(config => 
{
    // 扫描WebAPI自身程序集
    config.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly());
    // 扫描Domain项目程序集(通过处理程序类型获取)
    config.RegisterServicesFromAssembly(typeof(SheetUpdatedEventHandler).Assembly);
});

通过程序集名称加载
如果不想直接引用Domain中的类型,可以通过程序集名称加载(注意替换为你的Domain项目实际程序集名称,不含.dll后缀):

var domainAssembly = Assembly.Load("YourDomainProjectAssemblyName");
builder.Services.AddMediatR(config => 
{
    config.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly());
    config.RegisterServicesFromAssembly(domainAssembly);
});

方案2:封装扩展方法解耦

在Domain项目中创建静态扩展方法,封装Domain内MediatR处理程序的注册逻辑,WebAPI项目只需调用该方法即可,无需直接引用Domain内的具体类型:

Domain项目中添加扩展类

public static class MediatRDomainRegistrationExtensions
{
    public static MediatRServiceConfiguration AddDomainEventHandlers(this MediatRServiceConfiguration config)
    {
        // 扫描Domain项目内的所有MediatR服务
        config.RegisterServicesFromAssembly(typeof(SheetUpdatedEventHandler).Assembly);
        return config;
    }
}

WebAPI项目中调用扩展方法

builder.Services.AddMediatR(config => 
{
    config.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly());
    // 调用Domain提供的扩展方法
    config.AddDomainEventHandlers();
});

注意事项

  • 确保WebAPI项目已引用Domain项目(或Domain项目已作为NuGet包被WebAPI引用),否则无法加载Domain程序集。
  • 确认SheetUpdatedEventHandler的访问修饰符为public,否则MediatR无法扫描到该类型。
  • 使用程序集名称加载时,需确保名称与Domain项目输出的程序集名称完全一致(可在Domain项目属性的"生成"标签中查看)。

内容的提问来源于stack exchange,提问作者MB_18

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 14:14:56