如何在Spring.Net中使用IApplicationContext注册对象?

时间:2011-11-24 11:12:41

标签: dependency-injection ioc-container spring.net

http://springframework.net/docs/1.3.1/reference/html/objects.html上的Spring文档说:

  

“除了包含如何获取信息的对象定义   创建一个特定的对象,也是IApplicationContext的实现   允许注册在外部创建的现有对象   容器,由用户。这是通过访问   ApplicationContext的IObjectFactory通过属性ObjectFactory   它返回IObjectFactory实现   DefaultListableObjectFactory。 DefaultListableObjectFactory支持   通过RegisterSingleton(..)和方法注册   RegisterObjectDefinition(..)“。

执行以下操作后,我正在尝试访问ObjectFactory对象:

var context = ContextRegistry.GetContext();

但是没有ObjectFactory属性。我正在使用Spring.Net v1.3.1.20711并在我的项目中引用了Spring.Core

我错过了什么?

2 个答案:

答案 0 :(得分:4)

ObjectFactory接口不公开IApplicationContext属性,但它是IConfigurableListableObjectFactory接口的一部分。

您的context变量属于推断类型IApplicationContext,因为返回类型为ContextRegistry.GetContext(),因此在VS中会显示ObjectFactory 1}}属性不可用。但是,如果仔细观察,您会发现 XmlApplicationContext属性是ObjectFactory,因为它实现了IConfigurableListableObjectFactory。正如Sebastian在他的回答中指出的那样,大多数(如果不是全部)应用程序上下文都实现了这个接口。

E.g:

var ctx = new XmlApplicationContext("objects.xml");
ctx.ObjectFactory.RegisterSingleton("MyObject2", new MyClass() { Name = "MyObject2"});
var o2 = (MyClass)ctx.GetObject("MyObject2");
Assert.AreEqual("MyObject2", o2.Name);

答案 1 :(得分:1)

只是为了补充Marjin的答案;这是获取我使用的工厂的扩展方法。

    /// <summary>
    /// Gets the ObjectFactory from the Spring context.
    /// </summary>
    /// <param name="context">The context.</param>
    /// <returns></returns>
    public static IConfigurableListableObjectFactory Factory(this IApplicationContext context)
    {
        return ((IConfigurableApplicationContext)context).ObjectFactory;
    }