Ringabhängigkeit



  • Guten Tag,
    in meiner Solution sind 2 Projekte von einander abhängig. Ich wüsste jetzt aber nicht wie ich das Problem beheben könnte, außer über ein neues Projekt, dass als Brücke dient, was ich aber hässlig fände.

    Ich habe die Klasse XmlDataController, die für das Verwalten von Xml Dateien zuständig ist.

    static public class XmlDataController
    {
        static public IEnumerable<Spell.Spell> ReadAllSpells()
        {
            XDocument xdoc = XDocument.Load("Datenbank.xml");
            var allspells = from s in xdoc.Elements("Spell")
                            select new Spell.Spell
                            (
                                //...
                            );
            return allspells;
        }
    }
    

    Diese Methode gibt mir dann eine Liste aller Spells zurück. Da ich eine Liste mit Objekten zurückgebe, ist mein XmlDataController auf die Spell-Klasse angewiesen. Meine Spellbook-Klasse ist aber wiederum auf den XmlDataController angewiesen, da sie sonst nicht ihre Spell's abspeichern kann.

    public class Spellbook
    {
        public List<Spell> SpellList { get; private set; }
    
        public Spellbook()
        {
            SpellList = XmlDataController.ReadAllSpells();
        }
    }
    

    Die Spell-Klasse und Spellbook-Klasse sind in einem Projekt.

    Hätte jemand vielleicht eine Idee, wie man dieses Problem gekonnt umgehen könnte? Vielleicht durch umformen oder einen Umweg, wie auch immer...

    Mit freundlichen Grüßen : Freaky


  • Administrator

    Das Design scheint mir ein wenig falsch zu sein. Wieso sollte ein XmlDataController etwas über ein Spell Objekt wissen müssen? Das lesen von Spells gehört doch eher in das Projekt mit dem Spell rein und dort wird dann XmlDataController verwendet?

    Grüssli



  • Du meinst also das ich XmlDataController zu einem Interface machen soll und in der Spell-Klasse dann das ReadAllSpells implementiere? Klingt eigentlich besser.


  • Administrator

    FreakY<3Cpp schrieb:

    Du meinst also das ich XmlDataController zu einem Interface machen soll und in der Spell-Klasse dann das ReadAllSpells implementiere? Klingt eigentlich besser.

    Ich weiss nicht, ob du es zu einem Interface machen solltest, da ich gar nicht weiss, was XmlDataController tut. Ich habe mich nur am Namen orientiert und dadurch folgendes geschlussfolgert:

    1. Projekt
    Bietet Hilfsmittel für die Verwaltung/Kontrolle von XML Daten.

    2. Projekt
    Definiert Spell und verwaltet diese Zaubersprüche.

    Da erscheint es mir irgendwie vernünftig, wenn das 2. Projekt mit Hilfe des 1. Projekts auch einen XmlSpellReader zur Verfügung stellt, schliesslich befindet sich die Verwaltung der Zaubersprüche im 2. Projekt. Die XML Daten Verwaltung/Kontrolle interessiert es nicht, was sie repräsentiert, sie ist nur für die XML Daten da.

    War das verständlich? Mir ist erscheint das irgendwie so logisch, dass ich mühe habe, eine vernünftige Erklärung hinzuschreiben 😃

    Grüssli



  • Hehe, nein ist schon okay. Ich hab das jetzt folgenderweiße geregelt:

    //Projekt.Interface.Xml
    public interface IXml<T>
    {
        XDocument ToXml();
        IEnumerable<T> ReadData();
    }
    
    //Projekt.Spell
    public class Spellbook : Interface.Xml.IXml<Spell>
    {
        //...
        public IEnumerable<Spell> ReadData(
        {
            XDocument xdoc = XDocument.Load("Datenbank.xml");
            var allspells = from s in xdoc.Elements("Spell")
                            select new Spell
                            (
                                //...
                            );
            return allspells;
        }
    }
    

Anmelden zum Antworten