Arrrgh!我正在這裏拉我的頭髮。我一直在嘗試使用IoC容器,並且一切看起來都很好,並且很棒,直到遇到一些您認爲非常基本的問題,例如將參數傳遞給構造函數。如何在使用IoC容器時將參數傳遞給構造函數?
說我有與引用類可以由IOC和值類型(或一些其他類型的)來解決的混合某處的類,它可以只在運行時被解決:
public NFLFeedUnitOfWork(NFLFileType fileType, object feed, IConverterMappings<NFLFileType> nflConverterMappings, IDbContext context)
: base(fileType, feed, nflConverterMappings, context, ContextType.NFL)
{
//new NFLContext(connstringname, setAutoDetectChanges)
}
在該特定示例我傳入枚舉(NFLFileType),對象實例,2個接口參數,並將一個額外的硬編碼屬性傳遞給基礎構造函數(ContextType.NFL)
如何在任何IoC容器中都可以做到這一點?
這個問題實際上是2倍:
1)如何在其僅在運行時已知的物體通過了嗎?舉例來說,此時的呼叫代碼如下所示:
protected override IFeedUnitOfWork GetUnitOfWork(NFLFileType fileType, object feed, string connectionString)
{
return new NFLFeedUnitOfWork(fileType, feed, new NFLConverterMappings(), new NFLContext(connectionString));
}
如何將此代碼轉換爲使用IoC? 也許是這樣的?
protected override IFeedUnitOfWork GetUnitOfWork(NFLFileType fileType, object feed, string connectionString)
{
return IFLFeedUnitOfWork(fileType, feed);
}
哪裏最後2個參數自動解決,並且自己提供1st 2 I?
2.)我如何傳入枚舉,對象,值類型到構造函數使用IoC? (或者可能不會在這個特定的情況下使用它?)
無論如何,任何幫助非常感謝,特別是在第一點。 此刻我正在使用Unity,但任何其他IoC容器也不錯。
我不想將IoC容器傳入代碼中,我只想在頂層的一個地方指定它。
+1。這顯示了OP的痛點並提供了很好的建議。 Unity還可以提供ResolverOverrides,以便在解析時覆蓋現有註冊(如[使用覆蓋解析對象](https://msdn.microsoft.com/en-us/library/ff660920(v = pandp 0.20)的.aspx))。我毫不猶豫地提到這一點,因爲我認爲上述建議應該是第一種方法。 –
這樣一個很好的答案!非常感謝Steven,這絕對回答了我的大部分問題,並指出了我的正確方向。但是你能澄清一下嗎?在案例1提供的例子中,我們基本上爲調用'GetUnitOfWork'方法的類創建了一個Provider。然而,在'GetUnitOfWork'本身的實現中,我們仍然將僅在運行時已知的2個值傳遞給'new NFLFeedUnitOfWork(...'這是否意味着我還需要爲'NFLFileType fileType'和'object創建另外2個提供者(這似乎有點太多,1個運行時值的提供者) – Tanuki
@Tanuki:我無法回答這個問題,我不知道那些vakues是什麼,以及它們是如何確定的。與這方面的信息,我會嘗試看看。 – Steven