Laden...

Klasseninstanz über mehrere Schichten

Erstellt von Gremgiz vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.930 Views
G
Gremgiz Themenstarter:in
106 Beiträge seit 2006
vor 12 Jahren
Klasseninstanz über mehrere Schichten

Hallo zusammen,

ich bin gerade dabei mich etwas in die Technologie der Schichten einzuarbeiten und stoße dabei auf ein Problem.

Ich habe einen Presentation-, Buisness und DataLayer. Der Datalayer hat noch den DataAccess und den DataHold unter sich.

Der Presentation und Buisness Layer benötigen nun eine Instanz einer Klasse, die im DataHold liegt. Der dem DataHold übergordnete DataLayer kann sich diese ja per "new" holen. Wie kann ich dass nun aber weiter nach oben geben? Der DataLayer hat ja Zugriff auf den DataHold, der Presentation und Buisness Layer hingegen kennen diese Schicht ja nicht und müssen sich das anderwertig holen. Der Presentation aus dem Buisness und der Buisness aus dem DataLayer.

Vielen Dank schon mal
Gremgiz

2.760 Beiträge seit 2006
vor 12 Jahren

Schau dir mal Data Transfer Objects an.

Im Grunde nur eine Klassse die deine Daten aus der Datenbank hält und die du durch die Schichten durchgibst (z.B. kannst du die DTOs in ein eigenes Assembly legen und dann von überall aus referenzieren.)

G
Gremgiz Themenstarter:in
106 Beiträge seit 2006
vor 12 Jahren

Hallo,

vielen Dank dafür. Es handelt sich aber nicht um Daten, die aus der Datenbank kommen. Das ist genauso gelöst wie beschrieben. Es geht um Laufzeitvariablen, die an verschiedenen Stellen benötigt werden. Diese werden im Presentation oder Buisness erzeugt und sollen dann nach "unten" durchgereicht werden, um an zentraler Stelle abrufbar zu sein. Klar könnte man den bereits beschriebenen Weg für jede Variable einzeln machen, wird aber ziemlich viel. Daher die Frage nach der Instanzierung, so dass ich mit die Klasse als Instanz hole und dann die benötigten Daten auslese bzw. hineinschreibe

Gruß
Gremgiz

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo Gremgiz,

Diese werden im Presentation oder Buisness erzeugt und sollen dann nach "unten" durchgereicht werden, um an zentraler Stelle abrufbar zu sein.

klingt nach globalen Variablen durch die Hintertür.

Klar könnte man den bereits beschriebenen Weg für jede Variable einzeln machen, wird aber ziemlich viel.

Und dann auch noch in Mengen.

Bist du dir sicher, dass du das brauchst und dass das ein guter Weg ist?

Der Presentation und Buisness Layer benötigen nun eine Instanz einer Klasse, die im DataHold liegt.

Warum? Wenn die Daten nur im Presentation und Buisness Layer benötigt werden, dann reicht es doch, wenn sie im Buisness Layer liegen. Sollten sie persistiert werden müssen, dann machst du das wie bei allen anderen Business-Objekten, die persistiert werden müssen, auch.

herbivore

1.820 Beiträge seit 2005
vor 12 Jahren

Hallo!

Korrekterweise müsste der DataLayer ein BusinessObject erstellen und mit den Daten aus DataHold füllen. Dieses Objekt würde dann im BusinesLayer verarbeitet werden.
Soll dieses nun im PresentationLayer dargestellt werden, müsste ein PresentationObject erstellt und die Daten aus dem BusinessObject kopiert werden.
Zum einen kann man dann die speziell dafür im Framework enthaltenen Interfaces IDataErrorInfo und INotifyPropertyChanged verwenden, zum anderen kann die Darstellung benutzerfreundlich gestaltet werden.

Nobody is perfect. I'm sad, i'm not nobody 🙁

G
Gremgiz Themenstarter:in
106 Beiträge seit 2006
vor 12 Jahren

Hallo,

Danke für die Anregungen. Ich habe damit einen Ansatz finden können, den ich weiter unten vorstellen werde.

@Herbivore

klingt nach globalen Variablen durch die Hintertür.

Es sind keine globalen Variablen. Es ist vielmehr so, dass eine Programmfunktion mehrfach aufgerufen werden kann (Tabbed Browsing) und unterschiedliche Daten enthält. Somit brauche ich halt für jeden Tab eine eigene Instanz. Würde ich es nicht so machen, würden die Variablen für den Tab A ja auch für den Tab B gültig sein, was falsch wäre.

Bist du dir sicher, dass du das brauchst und dass das ein guter Weg ist?

Zumindest mit meinem Kenntnisstand der Programmierung brauche ich dies - ob das ein guter Weg ist, kann ich nicht sagen. Man kann natürlich die Daten auch im BuinessLayer ablegen, aber da gehören Sie doch nach dem Schichtenmodell nicht hin?

@tom-essen
So ähnlich mache ich es jetzt auch

Hier mal meine Vorgehensweise (von unten nach oben):
DataHold Layer:
Definiert die Variable


namespace datahold
{
    public class datahold
    {
        public int Testzahl { get; set; }
    }
}

Data Layer
Definiert eine Klassenvariable für den DataHold Layer. Zwei Methoden kümmern sich um den Schreib- und Lesezugriff


namespace Data
{
    public class datalayer
    {
        datahold.datahold datenhalter { get; set; }

        public void writedata(int zahl)
        {
            switch (datenhalter == null)
            {
                case true:
                    datenhalter = new datahold.datahold();
                    break;
            }

            datenhalter.Testzahl = zahl;
        }

        public int readdata()
        {
            int Zahl = -10;

            switch (datenhalter == null)
            {
                case true:
                    Zahl = -1;
                    break;

                case false:
                    Zahl = datenhalter.Testzahl;
                    break;
            }

            return Zahl;
        }
   }
}

Buisness Layer
Ähnlich dem Data-Layer aufgebaut, da in diesem Beispiel nur als Durchreicher fungierend. Klassenvariable für den Data Layer und zwei Methoden für Lesen und Schreiben.


using Data;

namespace Buisness
{
    public class buisness
    {
        datalayer datenlayer { get; set; }

        public void buiswrite(int zahl)
        {
            switch (datenlayer == null)
            {
                case true:

                    datenlayer = new datalayer();
                    break;
            }

            datenlayer.writedata(zahl);
        }

        public int buisread()
        {
            int Zahl = -10;

            switch (datenlayer == null)
            {
                case true:
                    Zahl = -1;
                    break;

                case false:
                    Zahl = datenlayer.readdata();
                    break;
            }

            return Zahl;
        }
    }
}

Presentation Layer
Nimmt die Eingabe entgegen und speichert den Wert bzw. Liest den Wert aus und stellt ihn dar.


using System;
using System.Windows.Forms;
using Buisness;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        buisness buislay { get; set; }

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            switch (buislay == null)
            {
                case true:
                    buislay = new buisness();
                    break;
            }

            int Zahl = Convert.ToInt32(textBox1.Text);
            buislay.buiswrite(Zahl);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            switch (buislay == null)
            {
                case true:
                    buislay = new buisness();
                    break;
            }

            label1.Text = buislay.buisread().ToString();
        }
    }
}
49.485 Beiträge seit 2005
vor 12 Jahren

Hallo Gremgiz,

Man kann natürlich die Daten auch im BuinessLayer ablegen, aber da gehören Sie doch nach dem Schichtenmodell nicht hin?

doch, gerade! Warum sollten sie nicht?

herbivore

G
Gremgiz Themenstarter:in
106 Beiträge seit 2006
vor 12 Jahren

Hallo,

ich ging bisher davon aus, dass die einzelnen Schichten "in Stein gemeißelt" sind und entsprechend gehandhabt werden müssen. Ich werde es jetzt mal auf diese Art und Weise machen.

Vielen Dank
Gremgiz

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo Gremgiz,

ich ging bisher davon aus, dass die einzelnen Schichten "in Stein gemeißelt" sind.

meine Aussage steht in keinem Widerspruch damit. Ich habe gerade nicht gemeint, dass Objekte, die eigentlich in eine andere Schicht gehören oder die einen anderen Aufbau bzw. ein anderes abstraktionsniveau haben (aus pragmatischen Gründen) in den Buisness Layer verschoben werden sollen. Ich habe gemeint, dass die fraglichen Objekte von vornherein in den Buisness Layer gehören, also Business-Objekte sind bzw. als Business-Objekte gestaltet werden sollen.

herbivore