2011-08-25 51 views
13

我正在使用Autofac在我的應用程序中處理依賴注入。然而,我有一個組件在運行時做了一些反射魔術,我不知道它在編譯時需要什麼依賴。使用Autofac作爲服務定位器

通常情況下,我只想讓這個組件直接引用Container並解決它想要的任何內容。但是,實例化此類的類沒有對容器的引用。

實際上,我的組件依賴於Autofac。我寧願鬆散耦合,但在這裏似乎不是一種選擇。有沒有辦法(在構造函數的參數,或使用屬性注入,或任何!)Autofac給我在我的構造函數容器的引用?或者,有沒有更好的方法讓Autofac爲我提供一個可以解決任何問題的魔術服務定位器對象?

+2

雖然看到組件正在做什麼「魔術」,但會很有趣。也許除了服務定位器模式之外,還有其他方法。你能用一些代碼更新嗎? –

+0

我可以很好地描述它。隨着消息通過總線進入,代碼確定消息使用某些元數據的類型,然後構造所述類型。然後它需要使用Autofac查找所有'IConsume '的實現者(其中'type'是來自元數據的類型),然後調用它的Consume方法。 –

+0

你的意思是:http://kozmic.pl/2010/03/11/advanced-castle-windsor-ndash-generic-typed-factories-auto-release-and-more/ –

回答

12

是的,你可以。只要採取的依賴上IComponentContext

public class MyComponent 
{ 
    IComponentContext _context; 
    public MyComponent(IComponentContext context) 
    { 
     _context = context; 
    } 

    public void DoStuff() 
    { 
     var service = _context.Resolve(...); 
    } 
} 

更新來自點評:IComponentContext注入MyComponent取決於從哪個MyComponent得到解決的範圍。因此,重要的是要考慮註冊了什麼樣的終身範圍MyComponent。例如。使用InstancePerLifetimeScope,上下文將始終解析到取決於MyComponent的服務所處的相同範圍。

+0

這將使用多個生命週期範圍嗎?即IComponentContext是基礎容器還是範圍? –

+3

它將解析'MyComponent'被解析的範圍中的'IComponentContext'。所以如果'MyComponent'被註冊爲'InstancePerLifetimeScope','context'將始終從預期的範圍中解析出來。 –

+0

完美,正是我所需要的。 –

1

假如你有兩個組件,A和B.

如果A需要使用它之前瞭解關於B X,這是元數據的審訊,並在此excellent職位描述。

此外,即使您無法將您的設計調整爲該帖子,您應該再次嘗試確定是否真的需要將DI容器用作服務定位器。

在寫這篇文章的時候,我能找到的最好的博客文章是this之一。

+0

我不確定爲什麼你會回答一個已經回答良好的問題,而這個問題根本與我的問題無關......正如我所說,我的問題是不知道我需要解決哪個「B」問題直到運行時。 –

+1

@NikosBaxevanis +1,即使OP似乎沒有得到它。這兩個帖子都很棒。Nicholas發佈的這個單詞恢復了這一切:「同時,在你的組件中幾乎沒有任何藉口可以使用IContainer或IComponentContext」。 – rsenna

0

在其他情況下,如果您的組件不是通過使用DI創建的,您仍然可以使用服務定位器模式。 CodePlex上的通用服務定位器庫是完美的。