问题的根源
发生这种情况是因为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.Current
Castle 的 DynamicProxy 中寻找自己的解析器。它将直接使用您提供的解析器对象。