2012-02-15 25 views
1

我有一個問題,我spring.net配置:可選對象引用

<object id="O1"> 
    <constructor-arg ref="Dep1"/> 
    <constructor-arg ref="Dep2"/> 
</object> 

這是我的所有應用程序使用的通用配置的一部分。有些應用程序在其配置中定義了Dep2,有些則沒有。當特定的應用程序沒有定義Dep2時,我可以使第二個構造函數arg返回null(而不是報告錯誤)嗎?
我想解決這個問題,而不必重寫應用特定配置中的O1定義。

謝謝。

回答

2

您可以創建一個IFactoryObject,它返回null並將其配置到「特定應用程序」配置文件中。看到這個相關的問題:How do I configure a NULL object in Spring.Net。此外,如果Dep2是一個可選的依賴項(例如它可以爲null或它有一個合理的默認值),那麼最好將它定義爲屬性並使用屬性注入。

編輯

我預計這個工作,但它實際上並沒有,因爲返回null的IFactoryObject由Spring容器中的錯誤處理:

從上IFactoryObject.GetObject() API文檔

如果此方法被調用在一個封閉的IoC 容器和返回的上下文中,IoC容器 考慮噸他的工廠對象沒有完全初始化,並且拋出相應的(並且很可能是致命的)異常 。

類:

public class MyClass 
{ 
    public MyOtherClass Prop { get; set; } 

    public MyClass(MyOtherClass ref1) 
    { 
    } 
} 

public class MyOtherClass 
{ 
} 

public class NullFactoryObject : IFactoryObject 
{ 
    public object GetObject() 
    { 
     return null; 
    } 

    public Type ObjectType 
    { 
     get { return typeof(MyOtherClass); } 
    } 

    public bool IsSingleton 
    { 
     get { return true; } 
    } 
} 
在configfile1.xml

<object id="MyObject" type="q9292066_null_object_reference.MyClass, q9292066_null_object_reference"> 
    <constructor-arg name="ref1" ref="ref1" /> 
</object> 
在configfile2.xml

<object id="ref1" 
     type="q9292066_null_object_reference.NullFactoryObject, q9292066_null_object_reference" /> 
+0

Marijn,你能澄清這個多一點。我實現了O1FactoryObject。推薦將Dep1/Dep2傳遞給O1FactoryObject的方法是什麼?如果我通過它作爲財產/ constrcutor ref,我將面臨與我的問題相同的問題。如果我將Dep1/Dep2作爲簡單字符串傳遞,我需要在O1FactoryObject代碼中獲取它們。那是正確的解決方案?連同依賴於處理初始化順序?謝謝。 – Filip 2012-02-17 13:48:48

+0

我會添加一些代碼... – Marijn 2012-02-17 15:12:57

+0

完成...尚未測試,將在稍後執行。 – Marijn 2012-02-17 15:17:27