Dependency injection Sitecore 8.2 Autofac依赖项注入错误澄清
尝试将Autofac DI与Sitecore 8.2一起使用时,我遇到以下错误: 依赖项解析程序的类型为 “Sitecore.Mvc.Controllers.SitecoreDependencyResolver”,但应为 类型为“Autofac.Integration.Mvc.AutofacDependencyResolver”。信息技术 也似乎没有使用城堡中的DynamicProxy进行包装 项目这一问题可能是环境变化的结果 DynamicProxy实现或使用不同的代理库 包装依赖项解析器 有没有关于:Dependency injection Sitecore 8.2 Autofac依赖项注入错误澄清,dependency-injection,sitecore,autofac,sitecore8,sitecore8.2,Dependency Injection,Sitecore,Autofac,Sitecore8,Sitecore8.2,尝试将Autofac DI与Sitecore 8.2一起使用时,我遇到以下错误: 依赖项解析程序的类型为 “Sitecore.Mvc.Controllers.SitecoreDependencyResolver”,但应为 类型为“Autofac.Integration.Mvc.AutofacDependencyResolver”。信息技术 也似乎没有使用城堡中的DynamicProxy进行包装 项目这一问题可能是环境变化的结果 DynamicProxy实现或使用不同的代理库 包装依赖项解析器 有
AutofacDependencyResolver
不是MVC当前的依赖项解析程序。下面描述了AutofacDependencyResolver.Current如何尝试定位自身的当前实例:
因此,您需要使用MVC设置AutofacDependencyResolver。通常,您只需遵循以下指南:
虽然,这可能是你已经在做的事情。问题是,在某个时刻,Sitecore将用自己的依赖项解析器覆盖已配置的依赖项解析器,而这是在执行应用程序\u Start
后发生的。因此,AutofacDependencyResolver
最终没有被MVC使用
如何修复
请遵循以下指南:
其本质是,您需要创建一个自定义依赖项解析程序,该程序将首先使用AutofacDependencyResolver
,如果找不到依赖项,它将返回到SitecoreDependencyResolver
依赖项解析程序应配置为Sitecore的initialize
管道中的处理器,这将确保Sitecore的依赖项解析程序已可用
您可以在此GitHub存储库中找到特定于Autofac的示例:
重写Autofac的依赖项解析程序访问器
如果上述情况没有帮助,您可以告诉Autofac如何获取当前解析器
创建Autofac解析器时,将该对象保存在变量中,在MVC中注册链接解析器后,使用方法AutofacDependencyResolver.SetAutofacDependencyResolverAccessor()
:
var autofaccolver=新的autofaccependencycolver(容器);
IDependencyResolver-ChainedMDVCResolver=新的ChainedMDVCResolver(
自动解析程序,
依赖解析程序(当前);
DependencyResolver.SetResolver(链式分解器);
AutofacDependencyResolver.SetAutofacDependencyResolverAccessor(()=>autofacResolver);
现在,Autofac不会直接在
DependencyResolver.Current
或Castle的DynamicProxy中查找自己的解析器。它将直接使用您提供的解析器对象。谢谢Dmytro。我根据gibhub更新了解决方案。然而,我一直得到404。不确定ControllerBuilder.Current.SetControllerFactory(新的AutofacControllerFactory(容器))的用途是什么@NilPun啊,好吧,现在修复应该很容易了。只是永远不要使用AutofacDependencyResolver.Current使用MVC的DependencyResolver.Current
,或者通过构造函数参数获取依赖项,就像使用DI时一样。是的,使用Sitecore 8.2,您不需要更换控制器工厂。这只在Sitecore 8.1之前需要。谢谢@Dmtro。我在解决方案范围内搜索了“AutofacDependencyResolver.Current”,它没有被使用的位置。它在Autofac内部使用。有关如何使用AutofacDependencyResolver.SetAutofacDependencyResolverAccessor()
修复此问题,请参阅我的更新答案。您使用的是哪个版本的Sitecore?Sitecore 8.2。