Dependency injection 如何在Spring.Net中向IAApplicationContext注册对象?
Spring的文档说明: “除了包含有关如何 创建一个特定对象,IApplicationContext实现也可以 允许注册在外部创建的现有对象 容器,由用户创建。这是通过访问 ApplicationContext的IObjectFactory通过属性ObjectFactory 它返回IObjectFactory实现 DefaultListableObjectFactory.DefaultListableObjectFactory支持 通过RegisterSingleton(..)和 RegisterObjectDefinition(..)” 在执行以下操作后,我尝试访问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
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提供的所有上下文都实现了此接口,所以只要您不使用自定义接口,您就安全了。