Laden...

"Zeiger" oder Kopie

Erstellt von Kevka vor 16 Jahren Letzter Beitrag vor 15 Jahren 17.725 Views
B
66 Beiträge seit 2008
vor 15 Jahren

OK, ich habe nun deinen Post nachvollziehen können. Ich habe es nun so implementiert, aber es funktioniert leider nicht so wie es soll - eigentlich gar nicht.

Hier der Original Code, welcher funktioniert:


    public class myObject : BusinessObject
    {
        private int Id { get; set; }
        public string Nachname { get; set; }
        public string Vorname { get; set; }
        public string PLZ { get; set; }
        public string Wohnort { get; set; }
        public myBeruf Beruf { get; set; }
        public List<myHobby> Hobbys { get; set; }

        public myObject()
        {
            //Do nothing.
        }

        public myObject(string nachname, string vorname, string plz, string wohnort, myBeruf beruf, List<myHobby> hobbys)
        {
            Nachname = nachname;
            Vorname = vorname;
            PLZ = plz;
            Wohnort = wohnort;
            Beruf = beruf;
            Hobbys = hobbys;
        }
    }

   public class myHobby : BusinessObject
    {
        private int Id { get; set; }
        public string Bezeichnung { get; set; }

        public myHobby()
        {
            //Do nothing.
        }
        
        public myHobby(string bezeichnung)
        {
            Bezeichnung = bezeichnung;
        }

        public override string ToString()
        {
            return this.Bezeichnung+" ("+this.Id+")";
        }
    }

    public class myBeruf : BusinessObject
    {   
        public int Id { get; set; }
        public string Bezeichnung { get; set; }

        public myBeruf()
        {
            //Do nothing.
        }

        public myBeruf(int id, string bezeichnung)
        {
            Id = id;
            Bezeichnung = bezeichnung;
        }

        public override string ToString()
        {
            return this.Bezeichnung + " ("+this.Id+")";
        }
    }

Funktioniert soweit sehr gut, auch mit der Liste public List<myHobby> Hobbys.

Wie bereits erwähnt, möchte ich nun aber myObject, myHobby und myBeruf nicht von BusinessObject ableiten. Deshalb dein Lösungsvorschlag, den ich wie folgt implementiert habe:


    public class myHobby { ... }

    public class myBeruf { ... }

    public class myObject
    {
        // ...
        public TMyBeruf Beruf { get; set; }
        public List<TMyHobby> Hobbys { get; set; }

        //public myObject()

        public myObject(string nachname, string vorname, string plz, string wohnort, TMyBeruf beruf, List<TMyHobby> hobbys)
        {
            //...
        }
    }


    // Interface
    public interface ITransactional
    {
        void StartTransaction();
        void CommitTransaction();
        void RollbackTransaction();
    }

    public class TMyObject : myObject, ITransactional
    {
        private BusinessObject bObj = new BusinessObject();

        public void StartTransaction() { bObj.StartTransaction(); }
        public void CommitTransaction() { bObj.CommitTransaction(); }
        public void RollbackTransaction() { bObj.RollbackTransaction(); }
    }

    public class TMyBeruf : myBeruf, ITransactional
    {
        private BusinessObject bObj = new BusinessObject();

        public void StartTransaction() { bObj.StartTransaction(); }
        public void CommitTransaction() { bObj.CommitTransaction(); }
        public void RollbackTransaction() { bObj.RollbackTransaction(); }
    }

    public class TMyHobby : myHobby, ITransactional
    {
        private BusinessObject bObj = new BusinessObject();

        public void StartTransaction() { bObj.StartTransaction(); }
        public void CommitTransaction() { bObj.CommitTransaction(); }
        public void RollbackTransaction() { bObj.RollbackTransaction(); }
    }

Wenn ich mit TMyHobby, TMyBeruf und TMyObject arbeite, funktioniert das ganze Rollback etc. nicht mehr... auch nicht bei einfachen Properties wie "Nachname" o.ä...

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo be4all,

zum einen musst du dafür sorgen, dass im laufenden Programm überall Objekte vom Typ TMyObject, TMyBeruf usw. erzeugt werden und keine Objekte vom Typ MyObject, MyBeruf usw.

Zum anderen musst du den Code von BusinessObject so ändern, dass er an allen relevanten Stellen mit dem Typ ITransactional statt BusinessObject arbeitet. Ob man dass durch einen globales Ersetzen von BusinessObject durch ITransactional erreichen kann, weiß ich nicht. Es könnte sein, dass es Stellen gibt, an deren weitere Änderungen erforderlich sind, weil BusinessObject eine Klasse und ITransactional ein Interface ist.

herbivore