1

我有以下对象:

public class TestObject
{
    public String Something { get; set; }
}

和以下对象文件:

<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.springframework.net http://www.springframework.net/xsd/spring-objects.xsd">

  <object id="TestObject" type="SpringTest.TestObject" autowire="byName"/>
</objects>

我想做的是注册单例并获取TestObject。我这样做是这样的:

IConfigurableApplicationContext context = new XmlApplicationContext("objects.xml");
context.ObjectFactory.RegisterSingleton("Something", "something to test");
object obj = context.GetObject("TestObject");

但是对象属性 Something 始终为空。我认为这应该有效还是我做错了什么?

非常感谢!

4

3 回答 3

1

我不确定问题陈述到底是什么(从未将 Spring 用于 .NET)。但是,如果您想要 Don Kirkby 的建议,您应该在参考文档中查找 TargetSources(假设 .NET 实现也有它们)。

于 2009-09-11T07:53:23.273 回答
0

scope="singleton"如果你想要一个单身人士或者我错过了什么,你为什么不使用?

于 2009-09-03T06:25:19.377 回答
0

我认为您的 Something 属性未设置,因为在实例化应用程序上下文时会实例化单例。当您调用 RegisterSingleton 时,TestObject 已经被创建。bean 连接仅在创建 bean 时完成。

您可以通过延迟实例化单例来解决此问题。这样它直到第一次被请求时才会被实例化。希望那是在您注册了它需要的其他单例之后。

我不确切知道您要完成什么,但是如果我想在运行时更改一些单例 bean 之间的连接而不让 bean 意识到它,我会引入一些包装器对象。每个包装器都会实现一个接口,然后将所有方法委托给它当前的目标 bean。要更改接线,您只需更改包装器的目标。

更新:正如yawn 所建议的,Spring.NET 具有热交换目标源,可让您在运行时交换 bean 的实现。以下是文档中的一些示例代码,展示了如何交换 bean 实现:

HotSwappableTargetSource swapper = 
    (HotSwappableTargetSource) objectFactory.GetObject("swapper");
object oldTarget = swapper.swap(newTarget);

文档中的 XML 定义如下所示:

<object id="initialTarget" type="MyCompany.OldTarget, MyCompany">
</object>

<object id="swapper" 
    type="Spring.Aop.Target.HotSwappableTargetSource, Spring.Aop">
    <constructor-arg><ref local="initialTarget"/></constructor-arg>
</object>

<object id="swappable" 
    type="Spring.Aop.Framework.ProxyFactoryObject, Spring.Aop">
    <property name="targetSource">
        <ref local="swapper"/>
    </property>
</object>
于 2009-09-10T23:29:53.007 回答