【问题标题】:Sitecore 8.2 Autofac Dependency Injection Error ClarificationSitecore 8.2 Autofac 依赖注入错误说明
【发布时间】:2016-09-16 23:13:53
【问题描述】:

我在尝试将 Autofac DI 与 Sitecore 8.2 一起使用时遇到以下错误:

依赖解析器的类型 'Sitecore.Mvc.Controllers.SitecoreDependencyResolver' 但在意料之中 为“Autofac.Integration.Mvc.AutofacDependencyResolver”类型。它 似乎也没有使用 Castle 中的 DynamicProxy 进行包装 项目。这个问题可能是由于 DynamicProxy 实现或使用不同的代理库来 包装依赖解析器。

任何想法:

  1. 为什么会出现这种情况?
  2. 以上是什么意思?
  3. 如何解决?

【问题讨论】:

  • 您使用的是哪个版本的 Sitecore?
  • Sitecore 8.2 是。

标签: dependency-injection sitecore autofac sitecore8 sitecore8.2


【解决方案1】:

问题的根源

这是因为AutofacDependencyResolver 不是 MVC 当前的依赖解析器。以下是AutofacDependencyResolver.Current 如何尝试定位自身当前实例的描述:

http://docs.autofac.org/en/latest/integration/mvc.html#using-the-current-autofac-dependencyresolver

所以你需要用 MVC 设置AutofacDependencyResolver。通常,您只需遵循本指南:

http://docs.autofac.org/en/latest/integration/mvc.html#quick-start

虽然,这可能是您已经在做的事情。问题是,在某些时候 Sitecore 会用自己的依赖解析器覆盖配置的依赖解析器,这发生在 Application_Start 被执行之后。所以 AutofacDependencyResolver 最终没有被 MVC 使用。

如何解决

遵循本指南:

http://www.seanholmesby.com/safe-dependency-injection-for-mvc-and-webapi-within-sitecore/

它的本质是你需要创建一个自定义依赖解析器,它将首先使用AutofacDependencyResolver,如果没有找到依赖,它将回退到SitecoreDependencyResolver

依赖解析器应配置为 Sitecore 的 initialize 管道中的处理器,这将确保 Sitecore 的依赖解析器已经可用。

您可以在此 GitHub 存储库中找到特定于 Autofac 的示例:

https://github.com/HedgehogDevelopment/sitecore-chained-dependency-resolver/tree/master/InversionOfControl.Autofac

覆盖 Autofac 的依赖解析器访问器

如果上述方法没有帮助,您可以告诉 Autofac 如何获取当前的解析器。

创建 Autofac 解析器时,将该对象保存在变量中,然后在 MVC 中注册链式解析器后,使用方法AutofacDependencyResolver.SetAutofacDependencyResolverAccessor()

var autofacResolver = new AutofacDependencyResolver(container);

IDependencyResolver chainedMvcResolver = new ChainedMvcResolver(
    autofacResolver,
    DependencyResolver.Current);

DependencyResolver.SetResolver(chainedMvcResolver);

AutofacDependencyResolver.SetAutofacDependencyResolverAccessor(() => autofacResolver);

现在 Autofac 不会尝试直接在 DependencyResolver.Current 或 Castle 的 DynamicProxy 中寻找自己的解析器。它将直接使用您提供的解析器对象。

【讨论】:

  • 感谢 Dmytro。我更新了每个 gibhub 的解决方案。但是我一直收到 404。不确定 ControllerBuilder.Current.SetControllerFactory(new AutofacControllerFactory(container)); 的目的是什么
  • @NilPun 啊,好的,现在修复应该很容易。永远不要使用 AutofacDependencyResolver.Current ;-) 要么使用 MVC 的 DependencyResolver.Current,要么通过构造函数参数获取依赖项,就像使用 DI 时一样。
  • 是的,使用 Sitecore 8.2,您无需更换控制器工厂。这仅在 Sitecore 8.1 之前才需要。
  • 谢谢@Dmtro。我在解决方案范围内搜索了“AutofacDependencyResolver.Current”,它没有被使用。
  • Autofac内部使用。请参阅我的更新答案,了解如何使用 AutofacDependencyResolver.SetAutofacDependencyResolverAccessor() 修复它。
猜你喜欢
  • 2016-11-09
  • 1970-01-01
  • 2011-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-10
  • 2017-11-07
相关资源
最近更新 更多