Spring.Net/Caliburn v2 依赖地狱?

发布于 2024-10-31 14:44:25 字数 636 浏览 0 评论 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 之前被解析。

有什么想法吗?

I'm putting a project together with Spring.NET and Caliburn v2. I have some objects that I'm trying to instantiate, but not sure how to go about it.

I have been using Caliburn's IoC aspect annotations (Singleton and PerRequest) to get objects into the Spring context. The problem with this is that I have two objects, A and B, where Object B is a subclass of Object A (meaning B is also an A). This means that if I register both, Spring complains of ambiguity when an object of type A is requested. To get around this, I could stop using Caliburn's IoC aspects to register the objects and instead register them in the Spring context XML files. That way I can specify a named object in the Spring context file to use in the constructor of object C, which needs an object of type B injected.

However, this creates a new problem. Object B needs the Caliburn window manager to be injected (which is not available to the Spring container at the time when the objects listed in the context XML files are instantiated, but only later, after Caliburn has loaded and added its own objects to the Spring container).

I could simply remove the inheritance and let some code duplication occur between objects A and B, but then what would be the point of doing OO programming? Otherwise I guess I'm looking for a way to specify objects in Spring.NET context XML, but keep them from being resolved until after Caliburn has loaded.

Any ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

万劫不复 2024-11-07 14:44:25

我不熟悉 Caliburn,但如果你想延迟实例化,那么你可以将 xml 中的对象标记为lazy-init,如下所示:

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

I'm not familiar with Caliburn but if you want to delay instantiation then you could mark your objects in xml as lazy-init, like this:<object id="foo" type="..." lazy-init="true"/>

This way they will be instantiated when you first request them

剩一世无双 2024-11-07 14:44:25

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

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

I managed to solve this by maintaining a separate list of caliburn-dependent spring context XML files. I loaded these into the ApplicationContext object by adding the following code at the beginning of the overridden DisplayRootView() method in my application's bootstrapper:

var objectDefinitionReader = new XmlObjectDefinitionReader(applicationContext);
objectDefinitionReader.LoadObjectDefinitions(GetCaliburnDependentContextFiles());
applicationContext.Refresh();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文