0

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

我一直在使用 Caliburn 的 IoC 方面注释(Singleton 和 PerRequest)将对象放入 Spring 上下文中。问题在于我有两个对象,A 和 B,其中对象 B 是对象 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 加载之前阻止它们被解析。

有任何想法吗?

4

2 回答 2

1

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

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

于 2011-04-11T21:23:56.140 回答
0

我设法通过维护一个单独的 caliburn-dependent spring context XML 文件列表来解决这个问题。我通过在应用程序的引导程序中覆盖的 DisplayRootView() 方法的开头添加以下代码,将它们加载到 ApplicationContext 对象中:

var objectDefinitionReader = new XmlObjectDefinitionReader(applicationContext);
objectDefinitionReader.LoadObjectDefinitions(GetCaliburnDependentContextFiles());
applicationContext.Refresh();
于 2011-04-11T23:56:45.357 回答