我正在将一个项目与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加载之前要防止它们被解析。
有什么想法吗?
答案 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();