Schloss Windsor: Wie zirkuläre Referenzen in der Fabrik erstellte Objekte verhindern wurden, bezieht sich die erstellten Objekte in die Fabrik zurück

StackOverflow https://stackoverflow.com/questions/487786

Frage

Ich bin mit windsor Schloss als meine IoC-Container, und habe um ein bisschen ein Problem laufen. Dies wird am besten in Code erklärt, so ich werde es versuchen. Ich habe eine Fabrik-Klasse, dass ich mit Implementierungen einer bestimmten Schnittstelle zur Verfügung stellen soll:

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

Die Umsetzung der Factory-Klasse könnte so aussehen, obwohl ich nicht sicher bin, das ist der Weg zu gehen:     öffentliche Schnittstelle 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;
    }
}

Nun würde das funktionieren ok, aber wenn ich mein IObjectCreator Beispiel will Kind-Objekte erstellen eine bestimmte IObjectCreator verwenden, würde Ich mag ObjectCreatorFactory nennen, und dies führt offensichtlich in einer kreisförmigen Referenz:

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);        
}

Das funktioniert nicht aus. Was wäre der Weg für dieses Szenario zu gehen, wo die erzeugten Objekte in die Fabrik sich beziehen zurück für Kind Objekt Schöpfer?

War es hilfreich?

Lösung

Ich würde einfach die Fabrik bewegt aus den Konstrukteuren der verschiedenen spezifischen Objekt Schöpfer, und ein Verfahren auf der Schnittstelle IObjectCreator einführen statt, verantwortlich für die Schöpfer der Initialisierung:

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

Und dann rufen Sie einfach Initialze (diese) an jedem Objekt Schöpfer in die Fabrik übergeben.

In der Vergangenheit hat ich individuelle Lebenszyklusphasen verwendet habe zu kümmern automatisch „post-Konstruktion“ Aufbau von Komponenten Aufruf sowohl zirkuläre Abhängigkeiten zu vermeiden und auch von anderen damit verbundenen Sorgen zu kümmern (dh der Anwendung zusätzliche Komponentenkonfiguration aus einem externe Quelle wie eine Datenbank.) - aber es ist wahrscheinlich übertrieben für das, was Sie brauchen,

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top