2009-04-14 1370 views
4

我讀過關於Autofac的快速。我已經看到了編碼,它的整潔。但我不太清楚如何使用它。我用過StructureMap,它有一個靜態的ObjectFactory。 Ninject有內核,但在autofac的谷歌網頁,他們建議更換做這樣的事情:使用Autofac什麼是優點和缺點

using(var resolver = builder.Build()){ 
    var whatINeed = resolver.Resolve<INeedThisService>(); 
} 

這是一個WinForms應用程序,所以我從做上面有一個無效的對象狀態,所以我swiched具有全球性的IContainer,並做到這一點

using(var resolver = Program.Container.CreateInnerContainer()) 
{ 
    var whatINeed = resolver.Resolve<INeedThisService>(); 
} 

我已經使用它約3或5次。但是那有效嗎?或者我應該做的封面

internal static TServervice Resolver<TService>(){ 
     if(_container == null) _container = builder.Build(); 
     return _container.Resolve<TService>(); 
} 

至極,你會用了,爲什麼在類似

var whatINeed = Program.Resolve<INeedThisService>() 

和。還有與CreateInnerContainer()一起工作的懲罰?

回答

8

我不是AutoFac的專家,但是對其他Ioc容器有經驗。我認爲這個問題會給我一個嘗試AutoFac的理由。

基於Ioc容器的設計應該努力隔離訪問容器的所有代碼,除了在入口點或主機級別。我使用AutoFac和WinForms創建了以下示例,以顯示錶單如何通過構造函數訪問服務。

我不太清楚你爲什麼認爲你需要內部容器。也許你可以發表評論,我可以提供更詳細的回覆。

static class Program 
{ 
    [STAThread] 
    static void Main() 
    { 
     var builder = new ContainerBuilder(); 
     builder.Register<TheService>().As<INeedThisService>(); 
     builder.Register(f => new Form1(f.Resolve<INeedThisService>())).As<Form1>(); 

     using (var container = builder.Build()) 
     { 
      Application.Run(container.Resolve<Form1>()); 
     } 

    } 
} 

public interface INeedThisService { } 

public class TheService : INeedThisService 
{ 
    public TheService() { Console.WriteLine("ctor ThisService"); } 
} 

public partial class Form1 : Form 
{ 
    public Form1(INeedThisService service) 
    { 
     Console.WriteLine("ctor Form1"); 
     InitializeComponent(); 
    } 
} 
+0

我知道如何使用IoC,我希望能夠訪問我的服務的框架準則。使用StructureMap是一個明確的解決方案,您只需使用ObjectFactory。但是Autofac並不是那麼清晰,我不願意重新註冊所有組件 – 2009-06-12 09:29:50

+0

您能解釋一下「重新註冊」所有組件的含義嗎?您是否正在尋找裝配中所有類型的自動註冊?我將同時查看StructureMap的ObjectFactory。 – 2009-06-30 18:38:13

+0

重新註冊表示再次運行生成IContainer的部分。問題在於如何通過使用(..)語句來運行IContainer。 – 2009-08-16 19:09:27

3

正如Mark Lindell指出的那樣,您通常不需要直接在Autofac應用程序中訪問容器。

建議的方法是像Mark一樣在應用程序啓動時訪問一次。

隨後需要創建對象的其他組件可以聲明IContext類型的構造函數參數,Autofac將自動注入該構造函數參數。

的替代,不要求對Autofac裝配任何依賴,是利用工廠產生於描述:http://code.google.com/p/autofac/wiki/DelegateFactories

希望這有助於!

5

1)從你給的例子中我可以假設你正在嘗試使用IOC容器作爲服務定位器。儘管幾乎所有的容器都支持它,但主要用法是依賴注入。這意味着你應該避免調用Resolve方法,並讓容器爲你注入所有的依賴關係。兩者之間的區別(服務定位器和依賴注入)超出了這個話題。

2)如果你仍然想使用它作爲服務定位器,你可以使用根容器(Program.Container在你的情況下),而無需創建內部容器。順序應該是:

  • 在構建器
  • 註冊你的組件創建ContainerBuilder
  • 創建根容器:builder.Build()
  • 訪問根容器來解決組件實例

3)在不同範圍內需要單件行爲的情況下,容器層次結構可能很有用:

  • 全球\會議\請求(Web應用程序)
  • 應用\插件(桌面基於插件的應用程序)

BTW Autofac鼓勵人們使用tagged contexts來解決這樣的問題:

相關問題