3

尝试将 Autofac DI 与 Sitecore 8.2 一起使用时,出现以下错误:

依赖解析器的类型为“Sitecore.Mvc.Controllers.SitecoreDependencyResolver”,但预计为“Autofac.Integration.Mvc.AutofacDependencyResolver”类型。它似乎也没有使用 Castle Project 中的 DynamicProxy 进行包装。此问题可能是 DynamicProxy 实现更改或使用不同的代理库来包装依赖关系解析器的结果。

任何想法:

  1. 为什么会出现这样的场景?
  2. 上面是什么意思?
  3. 怎么修?
4

1 回答 1

5

问题的根源

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

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

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

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.

依赖解析器应配置为 Sitecoreinitialize管道中的处理器,这将确保 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.CurrentCastle 的 DynamicProxy 中寻找自己的解析器。它将直接使用您提供的解析器对象。

于 2016-09-17T07:12:04.373 回答