Asp.net

Web應用程序中的Autofac,我應該將容器儲存在哪里以便於訪問?

  • April 8, 2013

我對使用 Autofac 還是很陌生,我在文件和範例中錯過的一件事是如何輕鬆地從 Web 應用程序的不同位置訪問配置的容器。

我知道我可以使用 Autofac 控制器工廠來自動解析控制器的建構子注入依賴項,但是您可能需要解決尚未註入的其他內容呢?

有沒有我不知道的明顯模式?

謝謝!

首先盡量不要過度使用 IoC 容器。它非常適合“連接”控制器、視圖和服務,但是需要在執行時創建的對象應該由工廠對象而不是容器創建。否則,您將通過您的程式碼獲得 Container.Resolve 呼叫,並將其綁定到您的容器。這些額外的依賴破壞了使用 IoC 的目的。在大多數情況下,我只需在應用程序的頂層解決一兩個依賴項即可。然後 IoC 容器將遞歸地解決大多數依賴項。

當我在程序的其他地方需要容器時,這是我經常使用的一個技巧。

public class Container : IContainer
{
   readonly IWindsorContainer container;

   public Container()
   {
       // Initialize container
       container = new WindsorContainer(new XmlInterpreter(new FileResource("castle.xml")));

       // Register yourself
       container.Kernel.AddComponentInstance<IContainer>(this);
   }

   public T Resolve<T>()
   {
       return container.Resolve<T>();
   }
}

我將容器包裝在這樣的 Container 類中。它將自己添加到建構子中的包裝容器中。現在,需要容器的類可以注入 IContainer。(該範例適用於溫莎城堡,但它可能適用於 AutoFac)

Autofac“方式”是有一個IContext建構子參數。Autofac 將注入一個可用於解析類型的對象。

上下文通常是幕後的容器,IContainer實現IContext介面,但IContext僅限於解析。

我知道容器不應該被“過度使用”,但是作為 OP,我有需要解析提前不知道的類型的類(因此不能用作建構子參數)。我發現在這些情況下很有用,將容器視為可用於解析其他服務的另一個服務,並像任何其他服務一樣注入它。

如果您覺得使用 IContext 會將您綁定到 Autofac,並且您需要使用自己的介面對其進行抽象,那麼這只是在IContext您的容器中註冊一個包裝類的問題。

**更新:**在 Autofac 2 中,IContext被稱為IComponentContext.

引用自:https://stackoverflow.com/questions/644747