集成OrchardCore后Autofac模块依赖注册失效问题及解决方案咨询
这个问题的核心原因是:Orchard Core在初始化时会接管Autofac容器的构建流程,你原来通过ASP.NET Core默认ConfigureContainer方法注册的Autofac模块,并没有被Orchard的容器构建逻辑纳入其中,导致自定义的服务注册失效。
下面提供两种可行的解决方案,推荐第一种更贴合Orchard Core生态的方式:
方案一:将自定义Autofac模块适配为Orchard Core模块
Orchard Core有自己的Autofac模块规范,只需让你的AutofacModule实现OrchardCore.Environment.Autofac.IAutofacModule接口,Orchard启动时会自动扫描并加载这个模块,将你的注册合并到容器中。
修改后的模块代码:
using Autofac; using OrchardCore.Environment.Autofac; using System.Reflection; public class AutofacModule : IAutofacModule { public void ConfigureContainer(ContainerBuilder builder) { var asm = new[] { Assembly.GetExecutingAssembly(), Assembly.Load("Tharwat.Easy.Domain"), Assembly.Load("Tharwat.Easy.DataAccess"), }; builder.RegisterAssemblyTypes(asm) .AsImplementedInterfaces() .PublicOnly(); // 保留你原来的其他注册逻辑... } }
无需额外配置,Orchard会自动发现当前程序集中的IAutofacModule实现并执行注册。
方案二:在Orchard Core初始化时注入自定义注册
如果你不想修改现有模块的结构,可以在调用AddOrchardCore()时,通过ConfigureContainer回调直接添加你的Autofac注册,确保这些逻辑被纳入Orchard的容器构建流程:
修改Startup.cs中的ConfigureServices方法:
public void ConfigureServices(IServiceCollection services) { services.AddOrchardCore() .AddMvc() // 在这里注入自定义Autofac注册 .ConfigureContainer<ContainerBuilder>(builder => { var asm = new[] { Assembly.GetExecutingAssembly(), Assembly.Load("Tharwat.Easy.Domain"), Assembly.Load("Tharwat.Easy.DataAccess"), }; builder.RegisterAssemblyTypes(asm) .AsImplementedInterfaces() .PublicOnly(); // 保留你原来的其他注册逻辑... }); }
为什么原来的方式失效?
ASP.NET Core集成Autofac时,默认通过ConfigureContainer方法让开发者自定义容器,但Orchard Core内部重新实现了Autofac容器的构建流程——它会创建自己的ContainerBuilder实例,并不会调用你原来的ConfigureContainer方法,导致你的注册完全没有被添加到最终的容器中,自然无法解析依赖。
内容的提问来源于stack exchange,提问作者Alsabsab

