可选对象引用

时间:2012-02-15 10:59:07

标签: dependency-injection spring.net

我的spring.net配置有问题:

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

这是我所有应用程序使用的通用配置的一部分。有些应用程序在其配置中定义Dep2,而有些则不定义。当特定应用程序没有定义Dep2时,我可以使第二个构造函数arg返回null(而不是报告错误)吗? 我想解决这个问题而不在app特定配置中覆盖O1定义。

感谢。

1 个答案:

答案 0 :(得分:2)

您可以创建一个返回null的IFactoryObject并在“特定应用程序”配置文件中对其进行配置。请参阅此相关问题:How do I configure a NULL object in Spring.Net

此外,如果Dep2是一个可选的依赖项(例如它可以为null或者它具有合理的默认值),那么将它定义为属性并使用属性注入可能更好。

修改

我希望这可以工作,但它实际上没有,因为返回null的IFactoryObject被弹簧容器视为错误:

来自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" />