3

我越来越想使用Autofac DI与Sitecore的8.2以下时出现错误:Sitecore的8.2 Autofac依赖注入错误澄清

的依赖解析器是 类型的“Sitecore.Mvc.Controllers.SitecoreDependencyResolver”但预计 的类型是'Autofac.Integration.Mvc.AutofacDependencyResolver'。它 也不会使用来自城堡 项目的DynamicProxy打包。此问题可能是由于动态代理实现中的 更改或使用不同代理库到 来包装依赖关系解析器。

上的任何想法:

  1. 为什么这样的情况发生?
  2. 以上是什么意思?
  3. 如何解决?
+0

您正在使用哪一个精确版本的Sitecore? –

+0

Sitecore 8.2它是。 –

回答

5

根问题

这是因为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

应将依赖关系解析器配置为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中拥有自己的解析器。它将直接使用您提供的解析器对象。

+0

谢谢Dmytro。我更新了每个gibhub的解决方案。但是我一直得到404。不知道ControllerBuilder.Current.SetControllerFactory(新的AutofacControllerFactory(容器))的目的是什么; –

+0

@NilPun啊,好的,现在修复应该很简单。只是从不使用'AutofacDependencyResolver.Current' ;-)或者使用MVC的'DependencyResolver.Current',或者通过构造函数参数来获得你的依赖,就像你在使用DI时一样。 –

+0

是的,使用Sitecore 8.2,您不需要更换控制器工厂。这只是在Sitecore 8.1之前需要的。 –