Dependency injection 如何在Spring.Net中向IAApplicationContext注册对象?

Dependency injection 如何在Spring.Net中向IAApplicationContext注册对象?,dependency-injection,ioc-container,spring.net,Dependency Injection,Ioc Container,Spring.net,Spring的文档说明: “除了包含有关如何 创建一个特定对象,IApplicationContext实现也可以 允许注册在外部创建的现有对象 容器,由用户创建。这是通过访问 ApplicationContext的IObjectFactory通过属性ObjectFactory 它返回IObjectFactory实现 DefaultListableObjectFactory.DefaultListableObjectFactory支持 通过RegisterSingleton(..)和 Regist

Spring的文档说明:

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

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

var context = ContextRegistry.GetContext();
但是没有
ObjectFactory
属性。我正在使用Spring.NETV1.3.1.20711,并且在我的项目中引用了
Spring.Core


我缺少什么?

属性不是由
IAApplicationContext
接口公开的,而是
IConfigurableListableObjectFactory
接口的一部分

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

例如:

var ctx=newXMLApplicationContext(“objects.xml”);
ctx.ObjectFactory.RegisterSingleton(“MyObject2”,新MyClass(){Name=“MyObject2”});
VarO2=(MyClass)ctx.GetObject(“MyObject2”);
Assert.AreEqual(“MyObject 2”,o2.Name);

只是为了补充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;
    }
//
///从Spring上下文获取ObjectFactory。
/// 
///上下文。
/// 
公共静态IConfigurableListableObjectFactory工厂(此IAApplicationContext上下文)
{
返回((IConfigurableApplicationContext)上下文);
}

对-所以我只需将其转换为适当的类型以公开属性?如果您经常这样做,这会有所帮助。我不确定您是否希望在定期使用
iaapplicationcontext
时执行此操作
IConfigurableApplicationContext
扩展了
IApplicationContext
,因此尽管这适用于许多应用程序上下文,但不能保证适用于每个
IApplicationContext
。对于未实现
IConfigurableApplicationContext
IApplicationContext
,此扩展方法将在运行时引发强制转换异常。尽管您声明的内容是正确的,但据我所知,spring.net提供的所有上下文都实现了此接口,所以只要您不使用自定义接口,您就安全了。