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之前需要的。 –