Sitecore 8.2 Autofac依赖注入错误澄清

Nil*_*Pun 3 dependency-injection sitecore autofac sitecore8 sitecore8.2

我在尝试使用Sitecore 8.2的Autofac DI时收到以下错误:

依赖项解析程序的类型为"Sitecore.Mvc.Controllers.SitecoreDependencyResolver",但预计类型为"Autofac.Integration.Mvc.AutofacDependencyResolver".它似乎也没有使用Castle Project中的DynamicProxy进行包装.此问题可能是DynamicProxy实现更改或使用其他代理库来包装依赖项解析程序的结果.

任何想法:

  1. 为何会出现这种情况?
  2. 上面的意思是什么?
  3. 怎么修?

Dmy*_*nko 5

问题的根源

AutofacDependencyResolver是因为不是MVC的当前依赖性解析器.以下是如何AutofacDependencyResolver.Current尝试查找自身的当前实例的说明:

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

所以你需要设置AutofacDependencyResolverMVC.通常,您只需按照本指南操作:

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);
Run Code Online (Sandbox Code Playgroud)

现在,Autofac不会直接在DependencyResolver.CurrentCastle的DynamicProxy中寻找自己的解析器.它将直接使用您提供的解析器对象.