Как мне зарегистрировать объект с помощью IApplicationContext в Spring.Net? - PullRequest
3 голосов
/ 24 ноября 2011

Пружинная документация по http://springframework.net/docs/1.3.1/reference/html/objects.html гласит:

"В дополнение к определениям объектов, которые содержат информацию о том, как создать конкретный объект, реализации IApplicationContext также разрешить регистрацию существующих объектов, созданных за пределами контейнер, по пользователям. Это делается путем доступа к IObjectFactory ApplicationContext через свойство ObjectFactory который возвращает реализацию IObjectFactory DefaultListableObjectFactory. DefaultListableObjectFactory поддерживает регистрация через методы RegisterSingleton (..) и RegisterObjectDefinition (..). "

Я пытаюсь получить доступ к объекту ObjectFactory после выполнения следующих действий:

var context = ContextRegistry.GetContext();

Но ObjectFactory свойства нет. Я использую Spring.Net v1.3.1.20711 и на мой проект ссылаются Spring.Core.

Чего мне не хватает?

Ответы [ 2 ]

4 голосов
/ 24 ноября 2011

Свойство ObjectFactory не предоставляется интерфейсом IApplicationContext, но является частью интерфейса IConfigurableListableObjectFactory.

Ваша переменная context будет иметь логический тип IApplicationContext, поскольку тип возвращаемого значения ContextRegistry.GetContext(), поэтому в VS будет казаться, что свойство ObjectFactory недоступно. Однако, если вы присмотритесь поближе, вы увидите, что XmlApplicationContext имеет свойство ObjectFactory, потому что оно реализует IConfigurableListableObjectFactory. Как указывает Себастьян в своем ответе, большинство (если не все) контексты приложения реализуют этот интерфейс.

например:.

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 голос
/ 24 ноября 2011

Просто чтобы добавить к ответу Марджин; Вот метод расширения, чтобы получить Фабрику, которую я использую.

    /// <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;
    }
...