当我尝试使用Autofac DI与Sitecore 8.2时,我得到一个错误:
依赖解析器的类型为"Sitecore.Mvc.Controllers。SitecoreDependencyResolver',但在预期中类型为'Autofac.Integration.Mvc.AutofacDependencyResolver'。它似乎也没有使用来自城堡的DynamicProxy进行包装项目。这个问题可能是由于动态代理实现或使用不同的代理库来实现包装依赖解析器。
有什么想法吗?
- 为什么会出现这种情况?
- 以上是什么意思?
- 如何修复?
问题的根源
这是因为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
或城堡的动态代理。它将直接使用您提供的解析器对象。