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
。
我错过了什么?
答案 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;
}