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
相关产品推荐
相关产品推荐

