Laden...

Asyncrones Einlesen einer MYSQL Datenbank: ... invalid column ordinal

Erstellt von echdeneth vor 3 Jahren Letzter Beitrag vor 3 Jahren 3.037 Views
echdeneth Themenstarter:in
161 Beiträge seit 2019
vor 3 Jahren
Asyncrones Einlesen einer MYSQL Datenbank: ... invalid column ordinal

Moin, ich wollte mal besagtes Einlesen asyncron machen da bekomme ich die Exception:
"You have specified an invalid column ordinal."
Quelle:
bei MySql.Data.MySqlClient.MySqlDataReader.Throw(Exception ex)
bei MySql.Data.MySqlClient.MySqlDataReader.GetFieldValue(Int32 index, Boolean checkNull)
bei MySql.Data.MySqlClient.MySqlDataReader.GetInt32(Int32 i) ...
(funzt im syncronen Modus tadellos)


try
            {
                await Task.Run(() =>
                {
                    using (MySqlConnection connection = new MySqlConnection(ConnString))
                    {
                        connection.Open();

                        queery = "d02d0075.MPrioSK();";

                        using (MySqlCommand command = new MySqlCommand(queery, connection))
                        {
                            using (reader = command.ExecuteReader())
                            {
                                while (reader.Read())
                                {
                                    Application.Current.Dispatcher.Invoke(delegate
                                    {
                                        _listArtikel.Add(new PositionModel()
                                        {
                                            ArtikellisteIndex = reader.GetInt32(0),
                                            ArtikelNummer = reader.GetString(1),
                                            ArtikelName = reader.GetString(2),
                                            BestellMenge = reader.GetInt32(3),
                                            Geliefert = reader.GetInt32(4),
                                            PrioMenge = reader.GetInt32(5),
                                            Datum = reader.GetDateTime(6),
                                        });
                                    });
                                }
                            }
                        }
                    }
                });
            }
            catch (Exception)
            { }

Ich möchte etwas Erfahrung sammeln mit Multitasking, bin da noch recht grün hinter den Ohren und kann mir leider nicht vorstellen wo der Fehler liegt.

"Man muß die Dinge so einfach wie möglich machen. Aber nicht einfacher." Albert Einstein

W
955 Beiträge seit 2010
vor 3 Jahren

Na lies dir doch mal die Fehlermeldung richtig durch. Läuft das SQL-Statement auch in der Konsole nicht bzw. stimmt die Spaltenanzahl noch?
BTW, gibt es auch ein command.ExecuteReaderAsync() und reader.ReadAsync()? Dann könntest du diese verwenden mit await und würdest das Task.Run nicht benötigen.

echdeneth Themenstarter:in
161 Beiträge seit 2019
vor 3 Jahren

Läuft das SQL-Statement auch in der Konsole nicht?

SQL Anfrage läuft im syncronen Modus/PHPMyAdmin fehlerfrei.

gibt es auch ein command.ExecuteReaderAsync() und reader.ReadAsync()? Dann könntest du diese verwenden mit await und würdest das Task.Run nicht benötigen.

Ich teste mal "ExecuteReaderAsync()"...

Update: funzt auch nicht...
Stehe wie gesagt in dieser Thematik am Anfang

"Man muß die Dinge so einfach wie möglich machen. Aber nicht einfacher." Albert Einstein

W
955 Beiträge seit 2010
vor 3 Jahren

BTW 2: Wie viele Artikel liest du überhaupt ein? Wenn du bei jedem Objekt eine (eventuelle) Threadsynchronisation durchführst könnte das bei einer großen Anzahl an Objekten sehr teuer werden.

echdeneth Themenstarter:in
161 Beiträge seit 2019
vor 3 Jahren

Die Ausgabe ist auf 3 begrenzt (... LIMIT 3;)

Async bei MySQL ist vorhanden:
"using (reader = (MySqlDataReader)await command.ExecuteReaderAsync())
{
while (await reader.ReadAsync())..."

nach dem was ich gelesen habe ist dies jedoch nicht async...
Does MySql Connection methods support async programming?

"Man muß die Dinge so einfach wie möglich machen. Aber nicht einfacher." Albert Einstein

T
2.224 Beiträge seit 2008
vor 3 Jahren

Sieht auch aus als würdest du in der UI deine Datenbank Verarbeitung einrühren.
Hier scheint also auch eine grundsätzliche Schicktentrennung zu fehlen.

Auch die Verarbeitung mit dem Dispatcher sieht sehr abenteuerlich aus.
Warum liest du nicht in deinem Task.Run() Block die Positionsmodells in eine Liste und lieferst diese zu rück.
Aktuell muss für jedes Item, was du einlist ein Invoke gemacht werden, hier wäre ein Invoke mit der gesamten Liste über AddRagen vermutlich um besser.
Auch kann es durch ein synchrones read vom DataReader aber dein Invoke dann zu Thread Synchronisationsproblemen kommen.
Wenn der Reader im anderen Thread weiterläuft, dann ist es auch kein Wunder dass du diese Meldung bekommst.

Trennen deine UI und deine Datenbank Code durch eine saubere Schichten Trennung nach dem Drei-Schichten Modell.
Dann hast du auch solche Konstrukte nicht.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

echdeneth Themenstarter:in
161 Beiträge seit 2019
vor 3 Jahren

Auch die Verarbeitung mit dem Dispatcher sieht sehr abenteuerlich aus.

Das habe ich so recherchiert und manches waren Korrekturen von VS2019, Asche auf mein Haupt...

Trennen deine UI und deine Datenbank Code durch eine saubere Schichten Trennung nach dem Drei-Schichten Modell. Dann hast du auch solche Konstrukte nicht.

Das kam in der Umschulung (2.Lj) nicht vor, auch habe ich damit keine praktischen Erfahrungen.
Wenn das die Verwendung von MVVM impliziert, da bin ich auch noch rel. am Anfang.

"Man muß die Dinge so einfach wie möglich machen. Aber nicht einfacher." Albert Einstein

echdeneth Themenstarter:in
161 Beiträge seit 2019
vor 3 Jahren
  1. Ich verzichte bei SQL auf async
  2. Ja, ich werde mich eingehend mit der 3 Schichten Architektur befassen

Leider weiss ich nicht genau was mit:
"Sieht auch aus als würdest du in der UI deine Datenbank Verarbeitung einrühren."
gemeint ist im Bezug auf den Code (auch ohne async) X(
Ich nahm an GENAU SO wird's gemacht 🙁

"Man muß die Dinge so einfach wie möglich machen. Aber nicht einfacher." Albert Einstein

1.029 Beiträge seit 2010
vor 3 Jahren

Hi,

nein - so wird es genau nicht gemacht.

Wenn du einen Dispatcher in der selben Methode wie eine MySqlConnection verwendest - machst du es im Prinzip schon falsch. (siehe bereits verlinkten Artikel 3-Schichten-Architektur)

Kurz: Ein Dispatcher gehört zur UI - eine Connection zur Datenbank. Beide in der selben Methode zu verwenden zeigt nur, dass du eben nicht getrennt hast wie es sich gehört.

Warum man das so klar sagen kann?
Den Dispatcher verwendet man um eine asynchrone Datenänderung mit dem "UI-Thread" von WPF abzufangen, sodass du UI darüber eben im "richtigen" Thread informiert wird. Wenn du jetzt einen Dispatcher (und auch noch eine Liste, welche der UI bekannt ist - aus der Datenschicht aktualisieren lässt - dann kann das nur falsch sein)

Kann jetzt natürlich sein, dass der Dispatcher komplett unnötig verwendet wurde - aber dann solltest du aufhören einfach Code zu kopieren...

LG

echdeneth Themenstarter:in
161 Beiträge seit 2019
vor 3 Jahren

Habe zurückgerudert


try
            {
                using (MySqlConnection connection = new MySqlConnection(ConnString))
                {
                    connection.Open();

                    queery = "d02d0075.MPrioSK();";

                    using (MySqlCommand command = new MySqlCommand(queery, connection))
                    {
                        using (reader = command.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                    _listArtikel.Add(new PositionModel()
                                    {
                                        ArtikellisteIndex = reader.GetInt32(0),
                                        ArtikelNummer = reader.GetString(1),
                                        ArtikelName = reader.GetString(2),
                                        BestellMenge = reader.GetInt32(3),
                                        Geliefert = reader.GetInt32(4),
                                        PrioMenge = reader.GetInt32(5),
                                        Datum = reader.GetDateTime(6),
                                    });
                            }
                        }
                    }
                }

            }
            catch (Exception)
            { }

Nur wie ich hier die 3-Schichten-Architektur umsetze weiss ich noch nicht genau...
problem mit async ist gelöst da wie T-Virus schrieb, ist MySQL syncron, ergo...

"Man muß die Dinge so einfach wie möglich machen. Aber nicht einfacher." Albert Einstein

W
955 Beiträge seit 2010
vor 3 Jahren

Erzeuge eine Liste von PositionModel ohne den Dispatcher. Das Ding gibst du in die nächsthöhere Schicht raus. Diese baut das in die UI ein.

echdeneth Themenstarter:in
161 Beiträge seit 2019
vor 3 Jahren

Ich muss in dieser Thematik (3-Schichten-Modell) in einem etwas überschaubarem Projekt anfangen

"Man muß die Dinge so einfach wie möglich machen. Aber nicht einfacher." Albert Einstein

16.834 Beiträge seit 2008
vor 3 Jahren

Stehe wie gesagt in dieser Thematik am Anfang

Das Doofe ist, dass dies ein Thema ist, dass Du nicht einfach ausprobieren kannst.
Du musst es verstehen.

Wenn man mit einem Try-and-Error Vorgehen an eine Sache wie diese geht, wie Du evtl. andere Themen angegangen bist, dann fällt man bei async/await ganz ganz arg auf die Nase 😉

3.825 Beiträge seit 2006
vor 3 Jahren

Ich würde Dir empfehlen ein ORM oder Micro-ORM einzusetzen.

Bei mir würde deine Routine z.B. so aussehen :


foreach (DataObjectsArtikel ar in new DataCollectionArtikel(qry))
{
    ArtikellisteIndex = ar.rowindex;
    ArtikelNummer = ar.nr;
    ArtikelName = ar.name;
    BestellMenge = ar.bestmenge;
    Geliefert = ar.geliefert;
    PrioMenge = ar.priomenge;
    Datum = ar.datum;
}

Alles typsicher und mit richtiger Umwandlung.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

echdeneth Themenstarter:in
161 Beiträge seit 2019
vor 3 Jahren

Kann mir jemand des besseren Verständnisses Halber beschreiben wie ich diesen Code in die
3 Schichten zerlege? Oder nen neuen Thread aufmachen?



private ObservableCollection<PositionModel> _listArtikel = new ObservableCollection<PositionModel>();

...

private void Prio()
        {
            _listArtikel.Clear();
            try
            {
                using (MySqlConnection connection = new MySqlConnection(ConnString))
                {
                    connection.Open();

                    queery = "d02d0075.MPrioSK();";

                    using (MySqlCommand command = new MySqlCommand(queery, connection))
                    {
                        using (reader = command.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                _listArtikel.Add(new PositionModel()
                                {
                                    ArtikellisteIndex = reader.GetInt32(0),
                                    ArtikelNummer = reader.GetString(1),
                                    ArtikelName = reader.GetString(2),
                                    BestellMenge = reader.GetInt32(3),
                                    Geliefert = reader.GetInt32(4),
                                    PrioMenge = reader.GetInt32(5),
                                    Datum = reader.GetDateTime(6),
                                });
                            }
                        }
                    }
                }

            }
            catch (Exception)
            { }
}

"Man muß die Dinge so einfach wie möglich machen. Aber nicht einfacher." Albert Einstein

echdeneth Themenstarter:in
161 Beiträge seit 2019
vor 3 Jahren

Du musst es verstehen.

Das Problem...

Ich benötige leider kein abstraktes Theorem sondern ein Beispiel mit Kontext zu etwas
was ich im Code verwende um es zu verstehen.

Das Prinzip verstehe ich schon, ich weiss eben nicht wie ich es realisieren soll.

Google liefert hier leider nur ungenügendes... X(

"Man muß die Dinge so einfach wie möglich machen. Aber nicht einfacher." Albert Einstein

4.939 Beiträge seit 2008
vor 3 Jahren

Im einfachsten Fall hast du ersteinmal nur drei verschiedene Klassen (also je Schicht eine) und nur die UI-Klasse (d.h. bei MVVM die ViewModel-Klasse) benutzt die Logik-Klasse und diese wiederum die Datenzugriffsklasse.

T
2.224 Beiträge seit 2008
vor 3 Jahren

Ich würde noch einen Schritt weitergehen als Th69 und pro Schicht dann eine eigene DLL anlegen.
Damit hast du auch eine physische Trennung der Schichten.
Dadurch ist durch korrektes referenzieren der DLLs dann auch die Schichten von der UI, Logik und Datenhaltung abkapselt.

Mache ich auch bei kleienren Projekten, auch wenn man es hierbei auch durch einfache Klassen Trennung machen könnte.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

16.834 Beiträge seit 2008
vor 3 Jahren

Ich würde noch einen Schritt weitergehen als Th69 und pro Schicht dann eine eigene DLL anlegen.

Das lohnt sich in den seltenstes Fällen; meist großer Overhead für wenig Nutzen.
Verständnis und Anwendung des C# Namespaces designs hilft mehr.

Ganz doof: Schichten haben an für sich wenig mit DLLs zutun.
Das gleichzusetzen kann durchaus auch gefährlich sein.

Trennung in DLLs haben einen einzigen Vorteil: Circular References erzeugen einen Compiler Error.

T
2.224 Beiträge seit 2008
vor 3 Jahren

Wo soll da der Overhead sein?
Nur weil ich dann 2-3 DLLs habe?

Wie sähe dein Ansatz aus?
Alles in eine Assembly quetschen und wieder zurück zu Monolithen?
Oder eine DLL in der die Logik und Datenhalten nur per Namespace getrennt ist aber nicht direkt in der UI hängt?

Die Namespaces allein zur Trennung halte ich für eine zu schwache Trennung.
Würde ich nur bei kleinen Projekten machen, bei großen Projekten wäre dies aus meiner Sicht einfach eine zu dünn..
Damit kann mann dann auch ganz leicht wieder Datenbank Code in die UI mischen, da es dann keine physische Trennung gibt.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

16.834 Beiträge seit 2008
vor 3 Jahren

Alles in eine Assembly quetschen und wieder zurück zu Monolithen?

Mit der Aussage zeigst Du mir eher, dass Du nicht weißt, was ein Monolith ist.
Es ist problemlos alles in eine Assembly zu packen, solange die Namespaces passen (und Du keine Technologien vermischt).
Für die Datenbank und für die Logik wird das auf 99,9% der Anwendungen zutreffen - auch bei großen.

Bei großen Anwendungen hast Du aber in der Regel andere Anforderungen, als dass es sich das ergibt.
Hier aber gleich mit dem Dampfhammer so eine Aufteilung vorzuschlagen, mit dem der Threadersteller gar kein Mehrwehrt hat: finde ich nicht gut.

Die korrekte Handhabung von Namespaces sind der Grundstein, dass eine spätere Aufteilung in mehrere Assemblies, sofern notwendig, zB im Rahmen von Funktionserweiterungen, möglich werden.
Die sofortige Aufteilung in mehrere Assemblies ist keine Garantie, kein Schutz, dass die Struktur und damit das Software Design nicht scheisse wird.

Ich praktiziere das in dieser Form selbst auch - meiner Meinung recht erfolgreich.
Den Ansatz, sofort alles in viele Assemblies zu packen und mir damals zu helfen; den hatte ich vor Jahren auch mal.
War ein riesen Trugschluss.

Namespaces sind das absolute A und O.

echdeneth Themenstarter:in
161 Beiträge seit 2019
vor 3 Jahren

Die Theorie der 3-Schichten Trennung ist mir klar.
Es hapert bei der praktischen Umsetzung und an Beispielen die ich kontextuell nachvollziehen kann.
Falls Fragen auftauchen, für was für eine Art Projekt das gelte, Stichwort: Ockhams Rasiermesser

So habe ich es Verstanden:
3. Schicht
3.1 Datenbankzugriff in einer Methode, Einlesen in eine Liste (Lokale? Variable z.B. List<>, ObservableCollection(OC) oder DataTable)
3.2 Übergabe an Aufrufer (Frage: wie übergebe ich eine OC, eine DataTable - habe ich immer gemieden da ich das Konzept nicht 100%ig durchschaue)


public DataTable DataT()
   {
       DataTable dt = new DataTable(); //oder ObservableCollection
       using(SQL)
        {
          dt = DataReader
        }
       return dt;
   }

Wäre das korrekt, auch bei einer OC?

  1. Schicht
    2.1 Bearbeitung der DataTable, OC - Berechnung, etc.
    2.2 evtl. Aufruf einer weiteren Methode mit Rückgabe einer OC, DT

private void Bla()
{
   DataTable dt = DataT();
   dt = Irgendwas;
}

So?

  1. Schicht
    1.1 Bedienung und Behandlung der UI und Aufruf der Methoden der 2. Schicht
    1.2 ???

private void Blabla(irgendein KeyDownBlaBlaEventHandler)
{
 if (Textbox.Content != "" || AntwortAufFrageNachDemUniversumUndDemGanzenRest == 42)
   Bla(); 
}

Für sowas und zum Verstehen braucht man nicht fragen: Für was für ein Projekt?
Für das einfachste Projekt das gerade zum Verstehen nötig ist!

Wer es nicht kennt, Ockhams Rasiemesser:

  1. Von mehreren hinreichenden möglichen Erklärungen für ein und denselben Sachverhalt ist die einfachste Theorie allen anderen vorzuziehen.
  2. Eine Theorie ist einfach, wenn sie möglichst wenige Variablen und Hypothesen enthält und wenn diese in klaren logischen Beziehungen zueinander stehen, aus denen der zu erklärende Sachverhalt logisch folgt - Quelle: Wikipedia

"Man muß die Dinge so einfach wie möglich machen. Aber nicht einfacher." Albert Einstein

T
2.224 Beiträge seit 2008
vor 3 Jahren

Mit Methoden allein erreichst du keine saubere Schichten Trennung.
Auch hast du damit immer noch die jeweiligen Zuständigkeiten in der UI bzw. in der jeweiligen Klasse für dein Form gemischt.
Damit trennst du also nicht die Datenhaltung und Business Logik von der UI sonst verschiebst nur innerhalb der jeweiligen UI Klasse die Zuständigkeiten in einzelne Methoden.

Im einfachsten Fall hast du für jede Schicht, wie Abt schreibt, einen Unterteilung in Namespaces für spezifische Daten/Klassen.

Möglich wäre z.B. folgender Aufbau.

Projekt.UI
Oberste Ebene mit der eigentlichen Anwendung für den Benutzer.
Hier greifst du dann auf die Application/Business Schicht zu.
Wenn du Daten speichern musst, dann reichst du die Daten aus der UI gekapselt in eigene Klassen (View Model) an diese Schicht über die jeweilige Klasse aus der Application/Business Schicht.
Dadurch kann die UI und Logik auch sauber getrennt.

Projekt.Business/Projekt.Application
Ebene zwischen UI und Datenlayer mit der Anwendungslogik.
Hier hast du dann für deine spezifischen Datentypen (Klassen/Structs) entsprechende Klassen um diese z.B. über den Datalayer einladen und verarbeiten zu lassen.
Ebenfalls sollten hier die Daten aus der UI (View Models) in die entsprechenden Entitäten gemappt und an den DataLayer gegeben werden.
Dieser arbeitet dann nur noch mit seinen Entitäten und muss nichts von dem View Models für die UI wissen.

Projekt.Data
Die Unterste Ebene mit den Klassen für die Datenhaltung.
Diese kümmert sich um die Speicherung/Laden von Daten aus der Datenbank und/oder anderen Datenquellen.
Hier hast du dann auch eigene Klassen für die Datenrepräsentation in der Datenbank (Entitäten Klassen).
Diese haben dann i.d.R. auch nur Eigenschaften, aber möglichst nie irgend eine Form von Logik, da diese rein zur Datenrepräsentation dienen sollen!

Die technische Umsetzung hängt im Detail auch von der verwendeten Techniken ab.
Wenn du z.B. über einen OR Mapper wie Entity Framework arbeitest, dann liegen im Datalayer die Entitäten (Datenmodelle) sowie die Klassen (DbContext Klassen) zum speichern/laden der Daten.
Wenn du aber z.B. noch über ADO .NET auf die Datenbank zugreifst, dann hast du entsprechende Methoden in denen die SQL Anweisungen codiert werden und dann entsprechend die Daten gespeichert/geladen werden.

Somit würdest du die UI, Logik und Datenhaltung auch sauber durch eigene Klasse mit den jeweiligen Zuständigkeiten trennen.
Ebenfalls solltest du die Daten aus der UI bzw. die Daten für die UI über View Models liefern.
Dadurch kannst du erst die Trennung zwischen UI und Daten umsetzen.

Damit warst du im Kern deiner asynchronen Methode auch schon teilweise in der richtigen Richtung.
Hier müsst du aber eben die Trennung zwischen UI, Logik und Datenhaltung noch durch einzelne Klassen umsetzen.
Damit kannst du auch auf Dauer erst eine Anwendung langfristig pflegen und erweitern.

Ich hatte selbst vor einigen Jahren noch mit einer relativ kleinen Anwendung zu tun, die aber damals schon uralt war und keine Schichten hatte.
Diese zu pflegen und zu erweitern war kein Spaß mehr und wurde auch immer aufwendiger.
Durch eine saubere Schichten Trennung ist es dann auch einfach Änderungen/Erweiterungen vorzunehmen ohne das man graue Haare bekommt.
Auch dann ist der Code erst sauber testbar, da man Unit Tests anlegen kann und somit auch alle möglichen Fehlerfälle abdecken kann die man ohne nur durch aufwänndige manuelle Tests finden kann.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

5.658 Beiträge seit 2006
vor 3 Jahren

Du solltest dir den Artikel auch mal durchesen. Dort werden eigentlich die meisten deiner Fragen beantwortet. Eine ObservableCollection ist eine Implementierung einer Liste für das DataBinding mit MVVM in WPF, und gehört daher zur View. Wenn du diese jetzt in der Datenzugriffsschicht verwenden willst, hast du das Konzept ganz grundlegend nicht verstanden.

Mit DataTables habe ich noch nie gearbeitet, daher kann ich dazu nichts sagen. Normalerweise würde man dazu Klassen erstellen und verwenden, die die Daten repräsentieren (POCOs).

Ob man die Schichten sauber getrennt hat, merkt man spätestens beim Testen. Wenn du die Funktionalität aus einzelnen Schichten unabhängig von Funktionalität aus den anderen Schichten testen kannst, ist deine Architektur sauber, und sonst halt nicht. Wenn du eine Collection aus WPF benötigst, um deine DAL zu testen, dann eben nicht. Aber wenn du noch nie deinen Code mit Unit-Tests getestet hast, ist das alles nur Theorie.

Und was hat Ockham's Razor damit zu tun? Ockham war ein mittelalterlicher Mönch, der sich mit (wissenschaftlichen) Erklärungsansätzen für unerklärliche Phänomäne beschäftigt hat, nicht mit Entwurfsmustern aus der Software-Entwicklung.

Weeks of programming can save you hours of planning

echdeneth Themenstarter:in
161 Beiträge seit 2019
vor 3 Jahren

Oh ja, ich vergaß.
Mir ging es weniger um die Anwendung laut (scholastischer) Definition sondern eher um ein vereinfachtes Prinzip. (Mönch hin oder her...) Viele Profi-Entwickler mühen sich in Erklärungen, Sachverhalte in nur aus Ihrer Sicht einfacher Weise darzulegen. Leider trifft dies Nur Aus Ihrer Sicht zu. Für mich ohne jenen langjährigen, professionellen Kontext jedoch ist es dann alles andere als Einfach. Oft finden sich dann Klassen/Methoden/whatever darin, die ich in ihrer Funktion nicht nachvollziehen kann und somit nicht zur Erleuchtung beitragen. Daher so simpel wir möglich und so Komplex wie nötig.

Wenn also 2 oder mehrere mögliche Erklärungen vorhanden sind. ist die Einfache der/den Komplexeren vorzuziehen. Finde ich jedenfalls.

"Man muß die Dinge so einfach wie möglich machen. Aber nicht einfacher." Albert Einstein

echdeneth Themenstarter:in
161 Beiträge seit 2019
vor 3 Jahren

..., hast du das Konzept ganz grundlegend nicht verstanden.

🙁 nach den anderen beiträgen zufolge habe ich das anscheinend nicht.
Und ich dachte, ich hätte. Zumindest Grundlegend.

"Man muß die Dinge so einfach wie möglich machen. Aber nicht einfacher." Albert Einstein

16.834 Beiträge seit 2008
vor 3 Jahren

Im einfachsten Fall hast du für jede Schicht, wie Abt schreibt, einen Unterteilung in Namespaces für spezifische Daten/Klassen.

Nur zur Korrektur: das habe ich nicht gesagt.
Ich habe nirgends geschrieben, dass für jede Schicht ein Namespace existiert.

Namespaces sind zur Organisation von Klassen da.
Schichten im Sinne der Software Architektur existieren nur virtuell, lassen sich nicht zwangsläufig anhand des Namespace Aufbaus erkennen. Kann, muss nicht.

Bitte Basics durchgelesen: Namespaces (C# Programming Guide)

T
2.224 Beiträge seit 2008
vor 3 Jahren

Was Namespaces sind und wie diese funktionieren ist mir bewusst, ich arbeite nicht erst seit Gestern mit C#.
Wie soll ich aber sonst deinen Kommentar oben deuten?
Kannst du mir ggf. per PN erklären wie du sonst deine Schichten mit Namespaces organisieren willst wenn du doch auf DLLs zur Trennung verzichten willst?
Wenn man sich strikt an die reine Trennung hält kommt man um eine DLL je Schicht nicht herum.

Ich arbeite z.B. in einem Projekt seit 12 Jahren, was ohne eine DLL Trennung der Schichten nicht mal umsetzbar wäre.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

W
955 Beiträge seit 2010
vor 3 Jahren

Wieso? Er hat doch nicht gesagt dass alles in eine Lib gequetscht werden muss, man kann es tun. Wenn du für die einzelnen Schichten jeweils eine Lib verwenden willst dann tu es doch.

16.834 Beiträge seit 2008
vor 3 Jahren

Lass gut sein witte, irgendwann machts kein Sinn mehr irgendwas zu erklären 😃

T
2.224 Beiträge seit 2008
vor 3 Jahren

@witte
Eigentlich nur um zu verstehen, wie Abt es meint.
Auch um was daraus zu lernen, was auch nicht schaden kann.

@Abt
Schade, da ich eigentlich nur verstehen wollte was du meinst und wie dein Ansatz aussehen würde.
Aber wenn du lieber ablehnen mir gegenüberstehst, dann hat sich das Thema wohl erledigt.
Leider auch sehr bedauerlich, da ich gehofft hatte was neues dadurch zu lernen.
Auch sehr schwach von dir, anstelle eines ordentliche Gesprächs lieber direkt über eine ehrliche und offene Anfrage offen zu lästern.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.