2012-02-15 26 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