Дополнительная ссылка на объект - PullRequest
1 голос
/ 15 февраля 2012

У меня проблема с моей конфигурацией spring.net:

<object id="O1">
    <constructor-arg ref="Dep1"/>
    <constructor-arg ref="Dep2"/>
</object>

Это часть моей общей конфигурации, используемой всеми приложениями. Некоторые приложения определяют Dep2 в своей конфигурации, а некоторые нет. Могу ли я заставить второй конструктор arg вернуть ноль (вместо сообщения об ошибке), когда конкретное приложение не определяет Dep2?
Я хотел бы решить эту проблему без переопределения определения O1 в конкретной конфигурации приложения.

Спасибо.

1 Ответ

2 голосов
/ 15 февраля 2012

Вы можете создать IFactoryObject, который возвращает ноль, и настроить его в своем конфигурационном файле "конкретного приложения".См. Этот связанный вопрос: Как настроить объект NULL в Spring.Net .

Кроме того, если Dep2 является необязательной зависимостью (например, она может быть нулевой или имеет разумное значение по умолчанию)чем, вероятно, лучше определить его как свойство и использовать внедрение свойства.

Редактировать

Я ожидал, что это сработает, но на самом деле это не так, потому что IFactoryObject, возвращающий ноль, обрабатывается контейнером пружины как ошибка:

Из документации API на IFactoryObject.GetObject()

Если этот метод вызывается в контексте вмещающего контейнера IoC и возвращается, контейнер IoC будет рассматривать этот объект фабрики как неполностью инициализироваться и выдать соответствующее (и, скорее всего, фатальное) исключение.

Классы:

public class MyClass
{
    public MyOtherClass Prop { get; set; }

    public MyClass(MyOtherClass ref1)
    {
    }
}

public class MyOtherClass
{
}

public class NullFactoryObject : IFactoryObject
{
    public object GetObject()
    {
        return null;
    }

    public Type ObjectType
    {
        get { return typeof(MyOtherClass); }
    }

    public bool IsSingleton
    {
        get { return true; }
    }
}

в configfile1.xml:

<object id="MyObject" type="q9292066_null_object_reference.MyClass, q9292066_null_object_reference">
  <constructor-arg name="ref1" ref="ref1" />
</object>

вconfigfile2.xml:

<object id="ref1" 
        type="q9292066_null_object_reference.NullFactoryObject, q9292066_null_object_reference" />
...