Sitecore 8.2 autoface依赖注入错误说明



当我尝试使用Autofac DI与Sitecore 8.2时,我得到一个错误:

依赖解析器的类型为"Sitecore.Mvc.Controllers。SitecoreDependencyResolver',但在预期中类型为'Autofac.Integration.Mvc.AutofacDependencyResolver'。它似乎也没有使用来自城堡的DynamicProxy进行包装项目。这个问题可能是由于动态代理实现或使用不同的代理库来实现包装依赖解析器。

有什么想法吗?

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

问题的根源

这是因为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快速启动

虽然,这可能是你已经在做的。问题是,在某些时候Sitecore将用自己的依赖项解析器覆盖配置的依赖项解析器,并且在执行 Application_Start之后发生。因此,AutofacDependencyResolver最终不被MVC使用。

如何修复

遵循以下指南:

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

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

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

你可以在这个GitHub存储库中找到autofact特定的示例:

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

重写Autofac的依赖解析器访问器

如果上面没有帮助,你可以告诉autoface如何获得当前的解析器。

当您创建autofacc解析器时,将该对象保存在一个变量中,一旦您在MVC中注册了链接解析器,使用方法AutofacDependencyResolver.SetAutofacDependencyResolverAccessor():

var autofacResolver = new AutofacDependencyResolver(container);
IDependencyResolver chainedMvcResolver = new ChainedMvcResolver(
    autofacResolver,
    DependencyResolver.Current);
DependencyResolver.SetResolver(chainedMvcResolver);
AutofacDependencyResolver.SetAutofacDependencyResolverAccessor(() => autofacResolver);

现在autofacc将不会试图寻找自己的解析器直接在DependencyResolver.Current或城堡的动态代理。它将直接使用您提供的解析器对象。

最新更新