development

Asp.Net Core Controller mit OpenAPI

Wenn man im Projekt die Situation hat, dass man z.B. zwei unterschiedliche Personen hat, welche einerseits den OpenAPI Contract schreiben und anderseits implementieren, macht es Sinn, den Contract-First Approch zu verfolgen. Bei .NET geht das nicht so out-of-the-box, wie z.B. bei Spring mit Maven. Schritt 1: NSwag Studio laden Das neueste NSwag Studio kann man von hier beziehen: https://github.com/RicoSuter/NSwag/releases. In NSwag kann man den OpenAPI Contract pasten und on-the-fly generieren lassen.

Domain-Driven-Design

Bei Domain-Driven-Design gibt es zwei Flughöhen: Strategic: Hier befasst man sich mit dem „schneiden“ der Domänen Tactical: Hier geht es bis in die Implementierung Ich möchte meine Gedanken zu Tactical zu Blatt bringen. Analyse von Aggregaten Aggregate umschließen jene Entitäten, welche eine atomare Einheit bilden sollen. Das hört sich auf den ersten Blick nutzlos an – aber in fast allen Applikationen muss man von parallelem arbeiten an einem Datensatz durch mehrere Personen ausgehen.

Requirements dokumentieren in agilgen Projekten

Welche Funktionalität ist in meiner Software? Diese Frage ist oft in agilen Projekten nicht einfach zu beantworten – zumindest seriös. Ist das Benutzerhandbuch die einzig valide Quelle? Folgende Vorgehensweise habe ich kennengelernt (es gibt auch viele andere): 1. User-Story Map Als erstes versucht man die User-Stories zu priorisieren. Da kann eine User-Story Map helfen, um eine gute End-to-End-Sicht zu bekommen. Wichtig ist nur zu verstehen: Man soll nicht versuchen, alles in eine User-Story Map zu pressen – man kann ohne weiteres mehrere haben.

Static Web App mit Microsoft Azure

Azure Subscription Die Reise beginnt in Azure. Man muss eine Subscription anlegen - dort werden die Zahlungsdaten hinterlegt. Wichtig ist, dass man ein Budget anlegt (Achtung: Es kann bis zu 24h dauern, bis man ein Budget bei einer neuer Subscription anlegen kann). Repository Beginnen tut die Reise in Azure DevOps: Falls noch nicht passiert, muss man eine Organisation anlegen. Genauere Infos gibt es in der Dokumentation. Als nächstes muss man Azure DevOps und Azure verbinden.

SQL Server und RCSI

SQL Server Als erstes möchte ich das ganze bei SQL Server ausprobieren. Dazu starten wir eine Instanz in Docker: version: "3.8" services: sqldata: image: mcr.microsoft.com/mssql/server:2017-latest environment: - SA_PASSWORD=Pass@word - ACCEPT_EULA=Y ports: - "5434:1433" Danach erstellen wir eine Tabelle: CREATE TABLE master.dbo.Persons ( PersonID int NOT NULL PRIMARY KEY IDENTITY, LastName varchar(255) NOT NULL ); Anschließend fügen wir einen Datenatz ein: INSERT INTO master.dbo.Persons (LastName) OUTPUT INSERTED.PersonID VALUES('Mustermann'); Macht man nun in Transaktion 1:

Langzeitbackups machen

Die meisten Anbieter haben inzwischen Lösungen für Cloud-Drives (OneDrive von Microsoft, Google Drive, Apple iCloud). Doch ab und zu schläft man besser, wenn man noch ein zusätzliches Backup hat. Amazon Glacier Amazon Glacier ist kinderleicht zu bedienen und extrem kostengünstig. Das Anfordern des Inventars kann schon einige Stunden in Anspruch nehmen, aber ein Backup braucht man ja nicht jeden Tag. Wir reden hier von ca. 60cent pro Monat für 80GB. Man lädt die Inventar Metadaten lokal und synced dann.

DELL Precision 3660 vs. Techbold custom PC

Vorweg: es war nicht unbedingt notwendig. Aber ich habe mir vor 3 Jahren einen ThinkPad T14 gekauft – leider mit AMD. Aktuell habe ich auch einen T15 mit Intel und einen HP mite Intel und Nvidia (beides Arbeitslaptops). AMD bedeutet: USB mit externen Monitoren – kann funktionieren – muss aber nicht. Bluetooth reagiert nicht mehr? Kann passieren. TouchPad spielt verrückt (hat wahrscheinlich nichts mit AMD zu tun) – passiert – wurde dann gewechselt.

Entitäten und deren Identifier

Gedanken Identifier helfen dabei, manche Entitäten – eindeutig – zu benennen. Diesmal starte ich unten im Code-Model und mit einem technischen Detail: Wie gestalte ich die Tabellen am besten? CREATE TABLE schema.table ( id bigint PRIMARY KEY GENERATED ALWAYS AS IDENTITY meistens findet man sowas vor. Die erste Frage, welche sich stellt: Sollte man diese id nach außen hin zur Verfügung stellen? E.g. in einer API wie /persons/{id}? Meine Meinung dazu: nein.

Requirements-Management: From Domain to Code – Was ist Traceability?

Requirement Traceability “We just learned that the new union contract is changing how overtime pay and shift bonuses are calculated,” Justin reported at the weekly team meeting. “It’s also changing how the seniority rules affect priority for vacation scheduling and shift preferences. We have to update the payroll and staff scheduling systems to handle all these changes right away. How long do you think it will take to get this done, Chris?

Die Dosis macht das Gift – wieviel Logik soll in eine Datenbank?

Ich versuche meine Meinung mit folgender Definition zu beginnen: Object-relational impedance mismatch: Bezeichnet die Herausforderung, Objekte aus einer objektorientierten Programmiersprache in einer relationalen Datenbank zu speichern. Dafür gibt es ein oft verwendetes Hilfsmittel: ORM (Objekt-Relationales Mapping): Beispiele dafür sind Hibernate oder Entity-Framework. Es handelt sich um Libraries, die das Arbeiten mit relationalen Datenbanken – fast – transparent erledigen. Der Benutzer kann in seiner objektorientieren Welt bleiben und das Framework kümmert sich um Joinen, Change-Tracking, uvm.