Sitecore 8.2 Autofac 依赖注入错误说明

Sitecore 8.2 Autofac Dependency Injection Error Clarification

我在尝试将 Autofac DI 与 Sitecore 8.2 结合使用时收到以下错误消息:

The dependency resolver is of type 'Sitecore.Mvc.Controllers.SitecoreDependencyResolver' but was expected to be of type 'Autofac.Integration.Mvc.AutofacDependencyResolver'. It also does not appear to be wrapped using DynamicProxy from the Castle Project. This issue could be the result of a change in the DynamicProxy implementation or the use of a different proxy library to wrap the dependency resolver.

任何想法:

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

问题的根源

发生这种情况是因为 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 会用自己的依赖解析器覆盖配置的依赖解析器,并且会在 after 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 中寻找自己的解析器。它将直接使用您提供的解析器对象。