MediatR多DI容器集成指南:Autofac、DryIoc、Lamar等7大容器接入清单

发布时间:2026/9/19 23:16:18
MediatR多DI容器集成指南:Autofac、DryIoc、Lamar等7大容器接入清单
MediatR多DI容器集成指南Autofac、DryIoc、Lamar等7大容器接入清单【免费下载链接】MediatRSimple, unambitious mediator implementation in .NET项目地址: https://gitcode.com/gh_mirrors/me/MediatRMediatR是 .NET 中一款简洁、无依赖的中介者Mediator实现支持请求/响应、命令、查询、通知与流式请求。而MediatR 如何接入 Autofac、DryIoc、Lamar 等第三方依赖注入DI容器是不少新手上手的第一个坎——官方内置的AddMediatR只对 Microsoft DI 生效。本文给出一份7 大容器接入清单每种容器要注册哪些类型、流水线Pipeline行为如何挂载、有哪些容易踩的坑全部对照仓库内可运行的官方示例讲解。想跟着动手的话先克隆仓库git clone https://gitcode.com/gh_mirrors/me/MediatR所有示例都在 samples/ 目录下用MediatR.slnx打开即可逐个运行验证。一、为什么第三方容器需要手动接入MediatR 的核心只依赖一个IServiceProvider。它在任何容器里要正常工作只需要满足 4 件事能解析出IMediator内部实现 Mediator.cs能解析出IEnumerableIRequestHandlerTRequest, TResponse等处理器集合能解析出IEnumerableIPipelineBehaviorTRequest, TResponse等流水线行为处理器按**瞬态Transient**生命周期注册Microsoft 容器通过AddMediatR自动完成了以上全部见 MediatRServiceCollectionExtensions.cs而其他容器要么有Microsoft DI 适配器可借用要么就得手动扫描注册。下文按接入难度从低到高排序。二、7 大容器接入速查清单容器接入方式是否借助 MS DI 适配器官方示例Stashbox一行RegisterAssemblies否Program.csDryIocWithDependencyInjectionAdapter✅ 是Program.csLightInject按接口过滤扫描 RegisterOrdered✅ 是Program.csSimpleInjectorRegisterAssemblyTypes 集合注册部分Program.csAutofacAsClosedTypesOf扫描 5 种开泛型✅ 是Program.csLamarConnectImplementationsToTypesClosing扫描否Program.csCastle.WindsorBasedOn扫描 CollectionResolver否Program.cs下面逐个拆解关键代码。三、内置基线Microsoft DI 的一行AddMediatR这是理解其他容器的基线。在 README.md 中可以看到只需一行services.AddMediatR(cfg cfg.RegisterServicesFromAssemblyContainingStartup());它会从指定程序集扫描并注册IMediator、ISender、IPublisher以及IRequestHandler,、INotificationHandler、IStreamRequestHandler、IRequestExceptionHandler,,、IRequestExceptionAction,的全部实现生命周期均为 transient。注意流水线行为不会被自动扫描需要用cfg.AddBehavior()等方法显式添加。四、Stashbox 接入代码最少的容器Stashbox 内置了 MediatR 感知的程序集扫描规则是整个 samples/MediatR.Examples.Stashbox/ 里代码最短的var container new StashboxContainer() .RegisterAssemblies(new[] { typeof(Mediator).Assembly, typeof(Ping).Assembly }, serviceTypeSelector: Rules.ServiceRegistrationFilters.Interfaces); return container.GetRequiredServiceIMediator();serviceTypeSelector: Rules.ServiceRegistrationFilters.Interfaces这一参数是关键——它会按接口注册实现类型处理器集合和流水线行为都能被正确解析。五、DryIoc 接入借助 DI 适配器一行注册DryIoc 官方提供 DryIoc.Microsoft.DependencyInjection 适配器示例见 samples/MediatR.Examples.DryIoc/Program.cscontainer.RegisterMany(new[] { typeof(IMediator).GetAssembly(), typeof(Ping).GetAssembly() }, Registrator.Interfaces); var adapterContainer container.WithDependencyInjectionAdapter(services); return adapterContainer.GetRequiredServiceIMediator();⚠️一个专属坑点Mediator有多个构造函数DryIoc 默认可能选不中你想要的那个。示例代码中给出了两种处理方式要么加规则rules.With(FactoryMethod.ConstructorWithResolvableArguments)要么像示例那样显式指定构造函数参数Made.Of(() new Mediator(Arg.OfIServiceProvider()))。六、LightInject 接入接口过滤扫描 有序注册流水线LightInject 的示例samples/MediatR.Examples.LightInject/Program.cs分三步扫描处理器RegisterAssembly时用过滤函数只注册实现了IRequestHandler,或INotificationHandler的类型注册流水线用RegisterOrdered(typeof(IPipelineBehavior,), new[] { ... })显式声明行为的执行顺序注意MediatR 中后注册的行为先执行取适配器serviceContainer.CreateServiceProvider(services)得到IServiceProvider再解析IMediator。七、SimpleInjector 接入注意开泛型处理器的特殊注册SimpleInjector 示例samples/MediatR.Examples.SimpleInjector/Program.cs有两处值得注意用container.Register(typeof(IRequestHandler,), assemblies)这类按开泛型 程序集的 API 扫描处理器开泛型处理器必须显式纳入默认的GetTypesToRegister不会注册开泛型定义如ConstrainedPingedHandler示例中通过IncludeGenericTypeDefinitions true补齐否则带泛型约束的处理器会失踪流水线用container.Collection.Register注册为集合。八、Autofac 接入AsClosedTypesOf 扫描 5 种处理器Autofac 是最常被问到的容器示例在 samples/MediatR.Examples.Autofac/Program.cs。核心套路定义 5 种 MediatR 开泛型接口数组IRequestHandler,、IRequestExceptionHandler,,、IRequestExceptionAction,、INotificationHandler、IStreamRequestHandler,对每种接口用RegisterAssemblyTypes(...).AsClosedTypesOf(mediatrOpenType).AsImplementedInterfaces()扫描用builder.Populate(services)桥接 Microsoft DI再用AutofacServiceProvider解析IMediator。示例代码里有两条实战提示值得留意Autofac 返回最后注册的类型在前影响流水线顺序以及一个类同时实现多种处理器接口会导致被调用两次。九、Lamar 接入ConnectImplementationsToTypesClosing 自动接线Lamar 的扫描 API 表达力很强示例samples/MediatR.Examples.Lamar/Program.cs在一个cfg.Scan块里完成scanner.AssemblyContainingTypePing(); scanner.ConnectImplementationsToTypesClosing(typeof(IRequestHandler,)); scanner.ConnectImplementationsToTypesClosing(typeof(INotificationHandler)); // ... 以及另外两种异常处理器接口随后用cfg.For(typeof(IPipelineBehavior,)).Add(...)逐条挂接异常处理、前后置处理器等流水线行为并显式声明cfg.ForIMediator().UseMediator().Transient()。整体配置风格直观适合团队中已有 .NET 经验的新手阅读。十、Castle.Windsor 接入CollectionResolver 与逆变过滤Windsor 是清单中机关最多的容器samples/MediatR.Examples.Windsor/Program.cs三件必备的事CollectionResolver子解析器MediatR 依赖IEnumerableT集合解析Windsor 默认不支持必须AddSubResolver(new CollectionResolver(kernel))ContravariantFilter见 ContravariantFilter.cs用于让 MediatR 依赖的 C# 泛型逆变如用IRequestHandlerIRequest, Unit兼容更具体的请求在 Windsor 里也能生效处理器扫描BasedOn(typeof(IRequestHandler,)).WithServiceAllInterfaces().AllowMultipleMatches()注意AllowMultipleMatches()不能漏。另外记得Windsor 默认生命周期是Singleton示例注释中特别提醒在 Web 场景下应改用PerWebRequest或 Transient 风格避免IMediator被单例化带来的隐式共享状态问题。十一、通用避坑清单接入任何容器都检查一遍✅5 种处理器接口IRequestHandler,、INotificationHandler、IStreamRequestHandler,、IRequestExceptionHandler,,、IRequestExceptionAction,是否全部扫描注册漏掉异常处理器RequestExceptionHandler相关功能会静默失效✅集合解析容器是否支持IEnumerableT多实现解析Windsor 需子解析器SimpleInjector 用集合注册✅流水线顺序MediatR 中后注册的行为先执行用顺序注册API如 LightInject 的RegisterOrdered时方向别搞反✅生命周期IMediator与各处理器建议 transientLamar 示例中注释最多 container scoped✅开泛型处理器带泛型约束的处理器开泛型定义需要显式纳入注册SimpleInjector 需IncludeGenericTypeDefinitions✅构造选择Mediator有多个构造函数非 Microsoft 容器建议显式指定DryIoc 示例的做法。十二、怎么验证自己接对了每个容器示例都复用了同一个功能覆盖最全的运行器 Runner.csAutofac、Windsor、Stashbox 还开启了流式请求测试它会实际发出 Ping/Pong 请求、通知、异常与流式请求逐一检验处理器与流水线是否都按预期触发——你只需运行对应示例项目并对照控制台输出。如果想看同一套容器装配是否合规的自动化断言可以研究 test/MediatR.DependencyInjectionTests/ 目录其中 BaseServiceProviderFixture.cs 定义了对 6 种容器统一的解析检查项公共/私有/内部处理器能否被正确解析等各容器只需实现一个 fixture 即可复用整套断言。十三、选型小结新项目和 .NET 全家桶直接用 Microsoft DI AddMediatR零额外代码想用轻量容器Stashbox 和 DryIoc 接入成本最低几行代码 适配器已有 Autofac/Lamar 存量项目按本文的开泛型扫描 集合注册套路补一段注册代码即可官方示例可整段参照维护 Windsor 老系统重点检查CollectionResolver与ContravariantFilter是否都已就位。掌握5 种处理器接口 流水线集合 生命周期这个核心心智模型后你会发现无论换成哪个容器MediatR 的接入都只是换个 API 表达同一件事。【免费下载链接】MediatRSimple, unambitious mediator implementation in .NET项目地址: https://gitcode.com/gh_mirrors/me/MediatR创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考