Dependency injection 可选对象引用

Dependency injection 可选对象引用,dependency-injection,spring.net,Dependency Injection,Spring.net,我的spring.net配置有问题: 这是所有应用程序使用的通用配置的一部分。有些应用程序在其配置中定义了Dep2,有些则没有。当特定应用程序未定义Dep2时,是否可以使第二个构造函数arg返回null(而不是报告错误)? 我想在不覆盖特定于应用程序的配置中的O1定义的情况下解决这个问题 谢谢 您可以创建一个返回null的IFactoryObject,并在“特定应用程序”配置文件中对其进行配置。请参阅此相关问题: 此外,如果Dep2是一个可选依赖项(例如,它可以为null或有一个合理的默认值

我的spring.net配置有问题:


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


谢谢

您可以创建一个返回null的
IFactoryObject
,并在“特定应用程序”配置文件中对其进行配置。请参阅此相关问题:

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

编辑

我希望这能起作用,但实际上不行,因为返回null的
IFactoryObject
被spring容器视为错误:

IFactoryObject.GetObject()上的api文档

如果在封闭IoC的上下文中调用此方法 容器返回时,IoC容器将 将此工厂对象视为未完全初始化并抛出 相应的(很可能是致命的)异常

课程:

公共类MyClass
{
公共类属性{get;set;}
公共MyClass(MyOtherClass参考1)
{
}
}
公共类MyOtherClass
{
}
公共类NullFactoryObject:IFactoryObject
{
公共对象GetObject()
{
返回null;
}
公共类型ObjectType
{
获取{return typeof(MyOtherClass);}
}
公共图书馆
{
获取{return true;}
}
}
在configfile1.xml中:


在configfile2.xml中:



Marijn,你能再澄清一点吗。我实现了O1FactoryObject。建议采用何种方式将Dep1/Dep2传递给O1FactoryObject?如果我将其作为property/constructor ref传递,我将面临与问题中相同的问题。如果我将Dep1/Dep2作为简单字符串传递,我将需要在O1FactoryObject代码中获取它们。这是正确的解决方案吗?是否与处理初始化订单一起依赖?Thank.hmmm,这实际上不起作用-工厂对象似乎不允许返回null。我再看远一点。是的,我也有错误。即使您找到了一种方法让它工作,我仍然需要声明ref1。这不是什么大问题,因为我可以在通用配置中使用NullFactoryObject声明ref1,并在特定于应用程序的配置中重写它。不过,在Spring.NET检查引用之前,是否可以不声明ref1就完成,或者无法截获加载过程?不,不太可能。在我看来,有两种气味:(1)O1的类型有一个构造函数参数可以为null(2)您定义了一个不必满足的
Ref2
依赖项。警钟!为什么不覆盖O1配置?在我看来,这需要一个结构上的改进,而不是我们现在试图想出的破解方法。。。在里面也许Spring.NET也应该这样做?