Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Was ist falsch an meiner Schichtentrennung in einem ASP.NET MVC 5 Projekt?
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16112

beantworten | zitieren | melden

Zitat von Palin
Die hast du aber in einen Ini File nicht. Wie willst du sie also Mappen.

Prinzipiell hat eine Dateiendung nichts damit zutun, wozu die Datei verwendet wird.
In meinem Fall hat der Kunde die Ini-Datei als Datenbank missbraucht.

Ich weiß nicht ganz, wozu ihr die Ini-Dateien verwendet - hoffentlich eher dem Zweck entsprechend.
Aber selbst wenn es eine Konfiguration ist, sehe ich wenig Notwendigkeit.
Da bietet die BL einfach ein entsprechendes Interface an, und die Schicht drunter die Implementierung.
Zitat von Palin
Ich hab doch gar kein BL Model.


Also der Beschreibung nach schon....
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Palin
myCSharp.de - Member



Dabei seit:
Beiträge: 1115

beantworten | zitieren | melden

Zitat von Abt
Zitat von Palin
Die hast du aber in einen Ini File nicht. Wie willst du sie also Mappen.

Prinzipiell hat eine Dateiendung nichts damit zutun, wozu die Datei verwendet wird.
In meinem Fall hat der Kunde die Ini-Datei als Datenbank missbraucht.

Du hast mich da nur halb Zitiert. Über die Datei Endung hab ich nichts gesagt. Es geht um die Entitäten. Die du nicht hast. Ich fände es gut wenn du auf den Punkt (Entitäten) eingehen würdest.

Zitat von Abt
Zitat von Palin
Ich hab doch gar kein BL Model.

:baby: :baby: :baby:
Also der Beschreibung nach schon....
[/quote]

Nein hab ich niie gesagt.

Auf MorphieX Frage wo er die Bussines Objete Mappen soll.
Hab ich die Frage in den Raum gestellt.
Zitat von Palin
Die Frage ist ob du da nicht eher DTO bzw. Models hast.
Und eine alternative Vorgestellt.

Wenn ich hauptsächlich CRUD Aktionen haben. Ist es meines Erachten nicht nötig (ich kann wenn ich möchte) für jeden Layer ein eigenes Modell zu Verwenden. Grundlegend reicht es dann, da ein Modell für alle Layer zu erstellen. Bei dem dann alle Layer das Modell, kennen und das Model keiner der Layer.
Hab ich aber auch schon geschrieben.
Zitat von Palin
PL, BL und DAL kennen also das Modell. Das Model selber kennt niemanden.
Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16112

beantworten | zitieren | melden

Wir drehen uns im Kreis, und Du widersprichst Dir selbst.
Zitat von Palin
PL, BL und DAL kennen also das Modell. Das Model selber kennt niemanden.

Egal wie Du es formulierst: wenn alle Schichten das Modell kennen (und/oder davon abhängig ist), wozu es auch immer gehört, dann ist das eine Verletzung der Idee von Schichtentrennung.
Nicht mehr - und nicht weniger; völlig egal wie viele Schichten Du hast und wie Du sie nennst, ob Du das Modell jetzt im luftleeren Raum hast oder nicht.

Es bleibt ein Ideebruch und ein technologisches Problemkonstrukt, denn Du bist damit nicht in der Lage schichtspezifische Features (Annotations, Validations, Bindings..) nutzen zu können; und wenn es vereinzelt funktioniert, dann zB nur mit einer sehr starken Bindung.
Es ist auch nicht möglich eine isolierte Änderung oder Modularisierung durchzuführen - ohne den gesamten Stack zu brechen.

Das ist prinzipiell mal bei kleinen Tools nicht schlimm, einfach damit es wirtschaftlich und pragmatisch bleibt.
Aber es sollte definitiv nicht als generelle Empfehlung als Beispiel dienen, weil je größer die Anwendung ist, desto größer werden die Nachteile aufbauend aus diesem Konstrukt.

Zitat von Palin
Ich fände es gut wenn du auf den Punkt (Entitäten) eingehen würdest.
Ich kann Dir echt nicht folgen, was Du meinst.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Palin
myCSharp.de - Member



Dabei seit:
Beiträge: 1115

beantworten | zitieren | melden

Zitat von Abt
dann ist das eine Verletzung der Idee von Schichtentrennung.
Nein schau dir da bitte mal die Grundlagen an. Schichtentrennung sagt erst mal nichts anderes aus als das höher Schichten, nur auf niedrige Schichten zugreifen dürfen. (Wenn du alles in eigene Assemblies packst und es sich kompilieren lässt, ist es erfüllt). Was es verletzt wäre eine Strickte Schichten Trennung. Da darf nur auf die jeweils drunter liegende Schicht zugegriffen werden.
Zitat von Abt
Zitat von Palin
Ich fände es gut wenn du auf den Punkt (Entitäten) eingehen würdest.
Ich kann Dir echt nicht folgen, was Du meinst.
(So langsam wird es schwer es einfacher zu erklären).
Ich probiere es noch mal. Also in deinem DAL für den zugriff auf die SQL Datenbank. Hast du Entitäten, die eine Objektorientierte Darstellung der Struktur in der Datenbank sind (Einfachsteform ist eine Entität pro Tabelle.) Dort sind haben Tabellen oft Fremd Schlüsse. Wenn es für ein Feld nur bestimmte werte geben darf. In der DB sollten sie eigentlich in einer Tabelle hinterlegt sein. Bei Ini Dateien, muss meist der Benutzer wissen welche werte er dort eintragen darf. Wenn ich mir aus einer Datenbank Entitäten erstellen lasse, gibt es einen Verweis auf dem Fremdschlüssel, dieser ist in einer Ini Datei nicht enthalten. Wenn du in BL das Mapping machst kannst du nicht Entitäten benutzen, da sie nur im DAL für den SQL zugriff existieren. Aber nicht im DAL für den Ini Zugriff. Erkläre mit bitte wie du, das sinnvoll machen willst.

Bei der Gelegenheit, das ist bei uns einer der Gründe wie so wir ein eigenes Assemby für die "Modelle" eingeführt haben. Weil der BL sonst hätte wissen müssen ob es sich um eine Ini Datei handelt oder um eine SQL Datenbank. Und das wollte ich vermeiden. Also wenn du da wirklich eine gute Lösung für hast. Bin ich offen dafür.

p.s.
Wäre nett wenn du mich wenigsten soweit Zitieren würdest. Das meine Frage nicht aus dem Kontext gerissen wird.
Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16112

beantworten | zitieren | melden

Zitat von Palin
Schichtentrennung sagt erst mal nichts anderes aus als das höher Schichten, nur auf niedrige Schichten zugreifen dürfen.

Naja, Du machst es Dir hier leicht mit Deiner Argumentation.
Was Du machst ist nichts anderes als ein Element (hier das Modell) argumentativ aus einer Schicht zu nehmen und sagen, dass dies in der Luft hängen würde - und dadurch alles konform sei, was es natürlich nicht ist.
So funktioniert Software Architektur nicht.

Zugriffsrichtungen sind nur eine der Punkte einer Software Architektur, wie Du bestimmt in den Grundlagen auch gelesen hast, auf die Du mich aufmerksam machst.
Ein anderer, von mehreren ist die Frage, ob Du eine Schicht bearbeiten/erweitern kannst, ohne die anderen bearbeiten zu müssen.
Und das ist mit einem Modell in allen Schichten schlicht und einfach nicht möglich.

Es ist Pragmatismus, da ist das okay.
Aber zu behaupten, dass sei konform... das ist es halt nicht - egal wie viele Schichten man hat und wie sie heissen. ;-)
Ich hoffe jeder der das liest, beachtet dies.

Ich hab versucht Dich auf den Konzeptfehler hinzuweisen.
Diesen kannst Du jetzt nehmen und Dir einfach mal anschauen, oder resistent bleiben und weiter andere auf Grundlagen verweisen :-)

Aber da wir uns hier im Kreis drehen und der Ton wieder in Richtung der üblichen Herablassung wandert, bin ich mal raus.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Palin
myCSharp.de - Member



Dabei seit:
Beiträge: 1115

beantworten | zitieren | melden

Zitat von Abt
Naja, Du machst es Dir hier leicht mit Deiner Argumentation.

Ich mach es mir leicht?
Also ich habe "ausführlich" auf jede deiner Fragen geantwortet. Wobei ich wider holt, Sachen erklärt habe, die ich eigentlich vorher schon Erläutert habe.

Ich hab dich ein paar mal darum gebeten, zu erklären wie dein Konzept funktionieren soll, wenn es im Ini Assembly keine Entitäten gibt. Da hast du dich dumm gestellt Und gesagt das du meine Frage nicht verstehst. Eine Antwort hab ich immer noch nicht bekommen.

Ich kann dir jeder Zeit mein Konzept erklären. Da es Produktive im Einsatz ist. (Auch wenn du dir alle mühe gibst es falsch zu verstehen). Und funktioniert.

Dein Konzept hast du mir einfach nicht im "Detail" vorgestellt. Und weichst jetzt auch wieder aus.

Wenn du es besser weist als ich. Sollte es ja kein Problem sein, für dich, es vorzustellen und zu erklären was ich falsch mache.
Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern
private Nachricht | Beiträge des Benutzers
MorphieX
myCSharp.de - Member



Dabei seit:
Beiträge: 184
Herkunft: Rahden

Themenstarter:

beantworten | zitieren | melden

@Palin
Was sind das denn für Ini-Files?
In der Regel gibt es doch eine feste Definition, wie so ein Ini-File aussehen kann. Also kann man das Ini-File doch genau so im DAL zu Objekten mappen wie das Entity-Framework dies mit den SQL-Daten macht.

So ist es den darüber liegenden Layern total egal, ob die Daten aus einem Ini-File oder einer Datenbank kommen.

Oder missbraucht ihr hier das Ini-File irgendwie als unstrukturierte Datenbank? In dem quasi alles mögliche drin stehen kann?
private Nachricht | Beiträge des Benutzers
Palin
myCSharp.de - Member



Dabei seit:
Beiträge: 1115

beantworten | zitieren | melden

Ein Ini-File ist eine Einfache Konfigurationsfilesdatei. Die Schlüssel Werte Paare enthält.

Bei den Werten kann es aber sein, das da nicht jeder Beliebige Wert drin stehen kann. Als einfache Beispiel wenn die Software Deutsch und Englisch kann, könnte "de" und "en" erlaubt sein. Hier muss dann der Benutzer einfach wissen, welche Werte er eintragen darf. Bei einer Datenbank kann ich da einfach eine Weitere Tabelle erstellen in der die Werte drinstehen und dann einen Fremdschlüssel verwenden. Wenn ich im BL Mappe muss der BL jetzt wissen ob es die Tabelle gibt oder nicht.

Würde mich jetzt mal interessieren wie Abt das Problem löst.
Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern
private Nachricht | Beiträge des Benutzers
MorphieX
myCSharp.de - Member



Dabei seit:
Beiträge: 184
Herkunft: Rahden

Themenstarter:

beantworten | zitieren | melden

Hmm, ich verstehe das Problem auch noch nicht so ganz...

folgender Code gehört für mich dann z.B. in den DAL:

public class ConfigEntity
{
  public String CompanyName { get; set; }

  public String Language { get; set; }
}

public interface IConfigRepository
{
  ConfigEntity GetConfig();

  void SaveConfig(ConfigEntity config);
}

public class IniConfigRepository : IConfigRepository
{
  const String iniFileName = "config.ini";

  public ConfigEntity GetConfig()
  {
    // Ini-Datei hier lesen und in Objekt mappen
    return new ConfigEntity()
    {
      CompanyName = "Ini-Wert",
      Language = "Ini-Wert"
    };
  }

  public void SaveConfig(Config config)
  {
    // Ini-Datei hier speichern
  }
}

Die konsumierenden Layer wissen nun also nicht, dass es sich um eine Ini-Datei handelt. Im BL wird "ConfigEntity" nun wieder in ein Business-Model "Config" gemappt. -> genau so wie die Entities die aus einer Datenbank kommen.
private Nachricht | Beiträge des Benutzers
Palin
myCSharp.de - Member



Dabei seit:
Beiträge: 1115

beantworten | zitieren | melden

Für den Ini DAL wäre dein Entität korrekt (Obwohl es da eigentlich keine Entitäten gibt). Da Language kein Fremdschlüssel ist. Im SQL DAL sollte es so aussehen.

public class ConfigEntity
{
  public String CompanyName { get; set; }

  public Language Language { get; set; }
}

Da Language ja eine Eigene Tabelle ist.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Palin am .
Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern
private Nachricht | Beiträge des Benutzers
Regenwurm
myCSharp.de - Member



Dabei seit:
Beiträge: 300
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Es gibt kein 'Ini DAL' oder ein 'SQL DAL'. Es gibt genau ein Data Access Layer, welches zwei verschiedene Repositories (oder was auch immer) enthält.

Diese implementieren beide das (beispielsweise) IConfigRepository, welches mit einer ConfigEntity arbeitet.

Sprich;
Im DAL mappen die einzelnen Repositories ihre Daten in die Config Entity.
Im Business Layer wird dann die ConfigEntity in entsprechende Business Model gemappt.

Gruss,
Wurm.
ServiceStack & Angular = =)
private Nachricht | Beiträge des Benutzers
pinki
myCSharp.de - Member

Avatar #avatar-4072.jpg


Dabei seit:
Beiträge: 703
Herkunft: OWL

beantworten | zitieren | melden

Zitat von Palin
Da Language ja eine Eigene Tabelle ist.
Solange das Repository die Daten so zurück gibt, wie es das Interface vorsieht, ist das egal.
Dann muss das halt durch das Repository entsprechend aufgelöst werden.
private Nachricht | Beiträge des Benutzers
Palin
myCSharp.de - Member



Dabei seit:
Beiträge: 1115

beantworten | zitieren | melden

Zitat von pinki
Solange das Repository die Daten so zurück gibt, wie es das Interface vorsieht, ist das egal.
Dann muss das halt durch das Repository entsprechend aufgelöst werden.

Sag ich die ganze Zeit. Die Implementierung "Ini" und "SQL" Repository müssen auf die gleiche Klasse Mappen. Das Repository muss also das Mappen übernehmen.
Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern
private Nachricht | Beiträge des Benutzers
pinki
myCSharp.de - Member

Avatar #avatar-4072.jpg


Dabei seit:
Beiträge: 703
Herkunft: OWL

beantworten | zitieren | melden

Wenn ich das richtig verstanden habe, geben beide Repositories geben ein Objekt zurück, das dem Data Access Layer zugehörig ist.
Das Mappen in entsprechende BL-Objekte übernimmt dann die BL-Schicht.
private Nachricht | Beiträge des Benutzers
Palin
myCSharp.de - Member



Dabei seit:
Beiträge: 1115

beantworten | zitieren | melden

Genau nur das wir für die Implementierung des Zugriff auf Ini, Access und SQL eigen Assemblys haben. Haben die Klassen auch ein eigenes Assembly. Man kann sie wenn man möchte noch den DAL zurechnen oder sagen es ist ein eigener Layer.

Im BL machen wir das Mappen auf BL-Objekte nur wenn wir es brauchen. Wir haben viele einfache CRUD Ansichten. Da ist in den einzelnen Schichten zu Mappen nicht unbedingt nötig.
Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern
private Nachricht | Beiträge des Benutzers