我的spring.net配置有问题:
<object id="O1">
<constructor-arg ref="Dep1"/>
<constructor-arg ref="Dep2"/>
</object>
这是我所有应用程序使用的通用配置的一部分。有些应用程序在其配置中定义Dep2,而有些则不定义。当特定应用程序没有定义Dep2时,我可以使第二个构造函数arg返回null(而不是报告错误)吗? 我想解决这个问题而不在app特定配置中覆盖O1定义。
感谢。
答案 0 :(得分:2)
您可以创建一个返回null的IFactoryObject
并在“特定应用程序”配置文件中对其进行配置。请参阅此相关问题:How do I configure a NULL object in Spring.Net。
此外,如果Dep2是一个可选的依赖项(例如它可以为null或者它具有合理的默认值),那么将它定义为属性并使用属性注入可能更好。
修改的
我希望这可以工作,但它实际上没有,因为返回null的IFactoryObject
被弹簧容器视为错误:
来自IFactoryObject.GetObject()
如果在封闭的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" />