2012-02-15 12 views
1

私は私のspring.netの設定に問題がある:オプションのオブジェクト参照

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

これは、すべてのアプリケーションで使用される私の一般的な構成の一部です。一部のアプリケーションでは、構成にDep2が定義されており、一部のアプリケーションではDep2が定義されていませ特定のアプリケーションでDep2が定義されていない場合、2番目のコンストラクタargがnullを返すようにすることはできますか?
私はこれを解決するために、アプリケーション固有の設定でO1定義を上書きしないでください。

ありがとうございます。

答えて

2

nullを返すIFactoryObjectを作成し、「特定のアプリケーション」設定ファイルで設定することができます。関連する質問:How do I configure a NULL object in Spring.Netを参照してください。

さらに、Dep2が任意の依存性(たとえば、nullでもよいし、適切なデフォルト値を持つ)である場合は、プロパティとして定義してプロパティ注入を使用する方がよいでしょう。

編集

nullを返しますIFactoryObjectは春のコンテナによってエラーとして扱われているので、私は仕事にこれを期待したが、それは実際にはしません:IFactoryObject.GetObject()上のAPIドキュメントから

この方法は、封入のIoC 容器とリターンのコンテキスト内で呼び出されている場合、IoCコンテナは Tを検討します彼の工場オブジェクトは完全に初期化されておらず、 に相当する(そしておそらく致命的な)例外がスローされます。

クラス:configfile1.xmlで

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; } 
    } 
} 

:configfile2.xmlで

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

<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

+0

私はいくつかのコードを追加します... – Marijn

+0

done ...まだテストされていません、後でそれを行います。 – Marijn

関連する問題