Spring.Net/Caliburn v2依赖地狱?

时间:2011-04-10 23:19:20

标签: dependency-injection spring.net caliburn

我正在将一个项目与Spring.NET和Caliburn v2结合在一起。我有一些我试图实例化的对象,但不知道如何去实现它。

我一直在使用Caliburn的IoC方面注释(Singleton和PerRequest)来将对象引入Spring上下文。这个问题是我有两个对象,A和B,其中Object B是Object A的子类(意思是B也是A)。这意味着如果我同时注册两者,当请求类型A的对象时,Spring会抱怨模糊。为了解决这个问题,我可以停止使用Caliburn的IoC方面来注册对象,而是在Spring上下文XML文件中注册它们。这样我就可以在Spring上下文文件中指定一个命名对象,用于对象C的构造函数,它需要注入一个B类型的对象。

然而,这会产生一个新问题。对象B需要注入Caliburn窗口管理器(当实例化上下文XML文件中列出的对象时,Spring容器无法使用它,但仅在稍后,在Caliburn加载并将其自己的对象添加到Spring之后容器)。

我可以简单地删除继承并让对象A和B之间发生一些代码重复,但那么进行OO编程有什么意义呢?否则,我想我正在寻找一种在Spring.NET上下文XML中指定对象的方法,但是在Caliburn加载之前要防止它们被解析。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我不熟悉Caliburn,但是如果你想延迟实例化,那么你可以将xml中的对象标记为lazy-init,如下所示:<object id="foo" type="..." lazy-init="true"/>

这样,当您第一次请求时,它们将被实例化

答案 1 :(得分:0)

我设法通过维护一个独立的与校准相关的弹簧上下文XML文件列表来解决这个问题。我通过在应用程序的引导程序中重写的DisplayRootView()方法的开头添加以下代码,将它们加载到ApplicationContext对象中:

var objectDefinitionReader = new XmlObjectDefinitionReader(applicationContext);
objectDefinitionReader.LoadObjectDefinitions(GetCaliburnDependentContextFiles());
applicationContext.Refresh();