Laden...

Wo sollen in einer WebApi Interaktionen mit dem Dateisystem untergebracht werden

Erstellt von emuuu vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.487 Views
emuuu Themenstarter:in
286 Beiträge seit 2011
vor 6 Jahren
Wo sollen in einer WebApi Interaktionen mit dem Dateisystem untergebracht werden

Guten Tag zusammen,

wie der Titel schon sagt möchte ich Interaktionen mit dem Dateisystem (Directory.Create(), .GetFiles(), usw) in meiner WebApi (.netcore) unterbringen.

Zur Verdeutlichung:
Es geht niemals um lesende Zugriffe in der Form, dass die API irgendwelche Dateien zum Durchführen von Operationen braucht. Mir geht es also nicht ums DAL sondern die Geschäftslogik.

Wenn z.B. ein User irgendein Objekt via API neu anlegt soll neben den Datenbankeinträgen gleichzeitig auf einem Fileserver eine Ordnerstruktur generiert werden.

Ich würde der API (via Configuration als Singelton) einen Stammpfad mitgeben und jedes mal wenn ein Objekt angelegt wird, wird CreateObjectDirectories() durchlaufen.

Von der bisherigen Struktur habe ich einen Controller, welcher auf eine UnitOfWork zugreift, welche wiederum das Repository kennt.

Meine Frage nun: Wo muss ich rein formal und konform CreateObjectDirectories() unterbringen?

Oder anders gefragt wie gehe ich generell mit der Erstellung von Dateien in einer API um?

Vielen Dank schonmal ^^
emuuu

2+2=5( (für extrem große Werte von 2)

D
985 Beiträge seit 2014
vor 6 Jahren

Genauso wie du mit den anderen Daten umgehst.

Irgendwo schreibst du konkret die Daten in ... eine Datenbank/in eine Datei. Wohin konkret soll(te) der Anwendung egal sein.

emuuu Themenstarter:in
286 Beiträge seit 2011
vor 6 Jahren

Genauso wie du mit den anderen Daten umgehst.

Irgendwo schreibst du konkret die Daten in ... eine Datenbank/in eine Datei. Wohin konkret soll(te) der Anwendung egal sein.

Wo konkret ist der Anwendung ja auch egal. Mir geht es nicht um das konkrete "wie kennt weiß die Anwendung wo sie Dateien unterbringen soll".

Sondern nur wo ich formal z.B. CreateDirectoryWithTestFile() aufrufen sollte.

Ich könnte z.B. direkt in den Controller schreiben


        [HttpPost]
        public IActionResult AddNew([FromBody] Auftrag auftrag)
        {
            if (auftrag == null)
            {
                return BadRequest();
            }
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }
            using (var uow = _dataService.StartUnitOfWork() as UnitOfWork)
            {
                auftrag = uow.AuftragRepository.Add(auftrag);
                
                CreateDirectoryWithFancyFile();
                
                uow.Commit();

                return CreatedAtRoute("GetByID", new { id = auftrag.Id }, auftrag);
            }
        }

Meine Frage zielt darauf ab: Wo gehört der Aufruf hin? Bezüglich auf deine Antwort also wo sollte dieses Irgendwo sein?

2+2=5( (für extrem große Werte von 2)

16.833 Beiträge seit 2008
vor 6 Jahren

Richtig falsch.

Eine WebAPI sollte niemals mit Business Modellen arbeiten, denn im seltensten Fall sind das genau die Modelle, dessen Eigenschaften Du rausgeben willst.

Zudem sehen bei einer API in 99,999% die Modelle eines GET und eines POST anders aus.
Daher: extra Modellschicht für die API (oft auch SDK genannt).

Dann eine Service Schicht für die Business Logik und eben die Datenschicht.
Dass eine Action ein Repository kennt ist eine maßlose Verletzung dessen.

[Artikel] Drei-Schichten-Architektur

Normalerweise hast Du mindestens 3 Modellschichten:

  • API Modelle (zB "AuftragApiModel" für GET, "AuftragApiAddModel" für POST für Hinzufügen.. etc etc)
  • Business Modelle ("Auftrag")
  • Entitäten ("AuftragEntity")

PS: Du bist lang genug im Forum und ich hab Dich immer und immer wieder dran erinnert:
bitte unterlasse Full-Quotes. Bin es langsam leid immer die Beiträge zu editieren. Hab besseres zutun.
[Hinweis] Wie poste ich richtig?

PPS: bald wird es so sein, dass per Default ASP.NET Core nur noch asynchrone Actions zulässt.
Es macht bei neuem Code also sehr viel sinn, direkt asynchron zu implementieren.

D
985 Beiträge seit 2014
vor 6 Jahren

Und die Erzeugung der Verzeichnisstruktur ist definitiv eine Aufgabe, die die Datenschicht zu erledigen hat.

emuuu Themenstarter:in
286 Beiträge seit 2011
vor 6 Jahren

Vielen Dank für die Hinweise, werde es entsprechend nachlesen. Wobei ich es schwierig finde Dokus zu finden die eine tatsächliche Implementierung von Prinzipien und Paradigmen erläutern.
Auf der theoretischen Ebene verstehe ich auch z.B. die 3-Schichten-Architektur völlig problemlos. Nur eine tatsächliche Umsetzung, vor allem mit Erklärungen habe ich bisher noch keine gefunden.

PS: Du bist lang genug im Forum und ich hab Dich immer und immer wieder dran erinnert:
bitte unterlasse Full-Quotes. Bin es langsam leid immer die Beiträge zu editieren. Hab besseres zutun.

Bin gerade meine bescheidene Anzahl an Posts durchgegangen: Du hast mich genau null mal auf Fehler beim posten hingewiesen.
Trotzdem danke für den freundlichen Hinweis, ich werde ihn in Zukunft beachten.

Beste Grüße
emuuu

2+2=5( (für extrem große Werte von 2)

16.833 Beiträge seit 2008
vor 6 Jahren

..weil die tatsächliche Umsetzung sich auch unterscheidet.
Du wirst auch beim Thema Verbrennungsmotor das grundlegende Prinzip auf Wikipedia finden aber keine Blaupausen von Audi oder BMW.

In Dokumentationen sind i.d.R. auch nur Prinzipien gezeigt, weil sonst der Aufwand und die Lesezeit zu aufwändig wären und die eigentliche Erklärung des jeweiligen Elements in der Dokumentation unter gehen würde.

Deswegen ist Erfahrung so entscheidend in der Software Entwicklung.