2017-01-24 25 views
0

我得到DependencyResolutionException嘗試使用Autofac的parameterized instantiation來解決間接依賴關係。使用Autofac間接參數化實例化

假設我有以下類:

public interface IMuffin {} 

public class Muffin : IMuffin 
{ 
    public Muffin(IButter butter) {} 
} 

public interface IButter {} 

public class Butter : IButter 
{ 
    public Butter(IKnife knife) {} 
} 

public interface IKnife {} 

現在假設我想要一個IMuffin,但我想提供IKnife依賴作爲一個參數,像這樣:

public class Breakfast 
{ 
    public Breakfast(Func<IKnife, IMuffin> muffinFactory) 
    { 
     var muffin = muffinFactory(new Knife()); 
    } 

    private class Knife : IKnife {} 
} 

的問題是,我在muffinFactory(new Knife())上發現了一個例外,抱怨工廠無法使用可用的參數和服務來解決Butter構造函數的IKnife依賴項。這是沒有道理的,因爲我提供了一個IKnife的實例作爲工廠參數。

這似乎應該工作。我錯過了什麼?

+0

這是[常見問題解答的文檔處理(http://autofac.readthedocs.io/en/latest/faq/injecting-global -parameters.html)。 –

+0

好吧,我可以看到它們來自哪裏,但是即使_direct_依賴關係使用參數化實例化也涉及到一些「知識」。只需要一點重構即可將直接依賴關係變爲間接依賴關係。這實際上是發生在我的情況。使用上面的例子,假設'Muffin'最初直接依賴於'IKnife',所以'Breakfast'的參數化實例化會起作用。當「黃油」被分解出來時,「IKnife」成爲間接依賴,打破了「早餐」。 「IMuffin」消費者不應該受到這種變化的影響。 –

回答

0

您示例中的工廠爲IMuffin的工廠,您的IKnife參數作爲typed parameter傳遞。但是,您的Muffin類不需要IKnife實例。它需要一個IButter實例。

IKnife實例是Butter類所要求的。但是您傳遞給工廠的參數只能用於創建實例,並不用於解析Muffin的依賴關係。 muffinFactory的正確類型爲Func<IButter, IMuffin>

爲了使您的工作例如,你需要兩個工廠:

public class Breakfast 
{ 
    public Breakfast(Func<IKnife, IButter> butterFactory, Func<IButter, IMuffin> muffinFactory) 
    { 
     var butter = butterFactory(new Knife()); 
     var muffin = muffinFactory(butter); 
    } 

    private class Knife : IKnife { } 
} 
+0

是的,發佈後我嘗試了這種方法。因爲Autofac可以遍歷依賴樹,所以它似乎應該能夠沿用您指定的參數來解決沿途的任何依賴關係,而不僅僅是頂級的依賴關係。失望的是,我必須手拿它才能讓「IKNife」在二級上市。 –

+0

它_very有意不從頂層獲取參數,並將它們傳遞給整個堆棧中的每個分辨率。 [見常見問題。](http://autofac.readthedocs.io/en/latest/faq/injecting-global-parameters.html) –

+0

@TravisIllig,感謝您的鏈接 - 這有助於!儘管如此,請參閱我對原始問題的評論。 –