Dependency injection Sitecore 8.2 Autofac依赖项注入错误澄清

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实现或使用不同的代理库 包装依赖项解析器 有

尝试将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。