Замок Виндзор: Как предотвратить циклические ссылки в созданных фабрикой объектах, если созданные объекты ссылаются на фабрику - PullRequest
1 голос
/ 28 января 2009

Я использую Windsor Castle в качестве своего контейнера IoC, и столкнулся с небольшой проблемой. Это лучше всего объяснить в коде, поэтому я попробую. У меня есть фабричный класс, который должен предоставить мне реализации определенного интерфейса:

public interface IObjectCreatorFactory
{
    IObjectCreator GetObjectCreator(Type objectType);
}
public interface IObjectCreator
{
    T CreateObject<T>(IDataRow data);
    bool SupportsType(Type type);
}

Реализация фабричного класса может выглядеть следующим образом, хотя я не уверен, что это правильный путь: открытый интерфейс ObjectCreatorFactory: IObjectCreatorFactory { IEnumerable specificCreators; IObjectCreator defaultCreator;

    public ObjectCreatorFactory(IEnumerable<IObjectCreator> specificCreators, IObjectCreator defaultCreator)
    {
        this.specificCreators= specificCreators;
        this.defaultCreator= defaultCreator;
    }
    public IObjectCreator GetObjectCreator(Type objectType)
    {
        foreach (IObjectCreator creator in specificCreators)
        {
            if (creator.SupportsType(objectType))
            {
                return creator;
            }
        }
        return defaultCreator;
    }
}

Теперь это будет работать нормально, но если я хочу, чтобы мой экземпляр IObjectCreator создавал дочерние объекты с использованием определенного IObjectCreator, я хотел бы вызвать ObjectCreatorFactory, и это, очевидно, приводит к циклической ссылке:

public void SpecificObjectCreator:IObjectCreator
{
    IObjectCreatorFactory objCreatorFactory;
    public SpecificObjectCreator(IObjectCreatorFactory objCreatorFactory)
    {
        this.objCreatorFactory = objCreatorFactory;
    }
    T CreateObject<T>(IDataRow data)
    {
        T obj = new T;
        ChildObject childObject = objCreatorFactory.GetObjectCreator(typeof(ChildObject)).CreateObject<ChildObject>(data);
         .......
    }
    bool SupportsType(Type type);        
}

Это не работает. Каков будет путь для этого сценария, когда созданные объекты возвращаются к фабрике для создателей дочерних объектов?

1 Ответ

2 голосов
/ 05 февраля 2009

Я бы просто переместил фабрику из конструкторов различных конкретных создателей объектов и вместо этого ввел бы метод в интерфейсе IObjectCreator, отвечающий за инициализацию создателей:

public interface IObjectCreator
{
    T CreateObject<T>(IDataRow data);
    bool SupportsType(Type type);
    void Initialize(IObjectCreatorFactory factory);
}

А затем просто вызовите Initialze (this) для каждого создателя объекта, переданного на фабрику.

В прошлом я использовал настраиваемые этапы жизненного цикла, чтобы позаботиться об автоматическом вызове настройки компонентов после постройки, чтобы избежать циклических зависимостей, а также позаботиться о других связанных проблемах (например, применить дополнительную конфигурацию компонентов из внешний источник, такой как база данных) - но это, вероятно, излишне для того, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...