2012-02-20 79 views
1

我有一個類需要一個字符串作爲參數在其構造函數中,但該參數將由調用代碼決定。在同一時間點,這個類的生命週期必須與每個HTTP請求相關聯。所以,我創建了一個自定義的PerWebRequestTimelineManager,並將其用於配置文件中的目標類型。但由於構造函數中的字符串必須動態確定,因此我無法通過配置文件使用ConstructorInjection。我可以使用抽象工廠來解決動態依賴問題,但我不確定實現:您可以檢查下面的代碼並驗證方法。具體的RegisterType和解決的呼叫顯得有點格格不入,雖然在整個應用程序的連續通話決心將能夠檢索同一個實例:在Unity中指定運行時參數依賴關係

public class PerformanceTracerFactory : IPerformanceTracerFactory 
{ 
    private readonly IPerformanceTracer tracer; 

    public IPerformanceTracer CreateInstance(string operationTitle) 
    { 
     _container.RegisterType<IPerformanceTracer, PerformanceTracer>(new InjectionConstructor(operationTitle)); 

     return _container.Resolve<IPerformanceTracer>(); 
    } 
} 
配置文件的

相關部分:

<register type="IPerformanceTracer" mapTo="PerformanceTracer"> 
    <lifetime type="PerWebRequest"/> 
</register> 
<register type="IPerformanceTracerFactory" mapTo="PerformanceTracerFactory"/> 

我有另一個問題。如果上述使用代碼配置和注入依賴關係的方式是正確的,那麼我認爲我不需要配置條目。我始終可以使用合適的重載來推送自定義生命期管理器。如果我只想使用配置文件來實現同樣的功能,那麼我該如何對解決方案進行編碼?

回答

1

如果您使用基於容器的工廠,則不必在每次調用中註冊/解決IPerformanceTracer

註冊映射IPerformanceTracerPerformanceTracer一次在您的配置文件中並在解析您的界面時使用ParameterOverride

public IPerformanceTracer CreateInstance(string operationTitle) 
{ 
    return _container.Resolve<IPerformanceTracer>(new ParameterOverride("nameOfTheParameterInTheConstructorOfPerformanceTracer", operationTitle); 
} 
+0

非常感謝您的回覆塞巴斯蒂安。它完美地解決了這個問題。爲了避免由於對完整API無知而導致的類似問題,我還有另一個要求。引用Unity API文檔的最佳位置是什麼? – koder 2012-02-21 06:52:44

+0

@ user608100我很抱歉讓你失望,但Unity文檔通常很糟糕。有些信息可以在[MSDN]上找到(http://msdn.microsoft.com/en-us/library/ff663144.aspx)。但是你必須自己弄清楚大部分的東西。我目前正在編寫兩篇將在CodePlex上的Unity網站上發表的文章,闡述Unity內部的一些情況。但他們需要更多的時間來翻譯。 – 2012-02-21 06:57:01