Anwendungsfälle definieren

AnwendungsfĂ€lle sind die Einstiegspunkte auf der Anwendungsebene, die eine GeschĂ€ftsabsicht in ausfĂŒhrbare Software umwandeln. Am Lino sind sie drin Application/UseCases und sind um die EntitĂ€ten, aggregates, AufzĂ€hlungen, Module und Dienste herum organisiert, die in den vorherigen Phasen des Projekts definiert wurden.


Lino folgt einer strukturorientierten Struktur CQRS: Commands stellen Operationen dar, die ihren Zustand Àndern, wÀhrend Queries stellen Operationen dar, die Daten lesen. Durch diese Trennung bleiben Schreibregeln, Lesemodelle, Validierungen, Nachverfolgung, Protokollierung und AntwortvertrÀge explizit und einfacher zu warten.


DER Result Pattern standardisiert die RĂŒckgabe von VorgĂ€ngen und kapselt Erfolg, Misserfolg, Fehlermeldungen und daraus resultierende Daten. Anstatt Ausnahmen fĂŒr erwartete GeschĂ€ftsablĂ€ufe zu verwenden, gibt handler a zurĂŒck Result oder Result<T> mit Wert, Fehler oder no-content, je nach Bedarf.


CLI generiert die ersten Dateien fĂŒr einen Anwendungsfall, der generierte Code ersetzt jedoch nicht die DomĂ€nenanalyse. Der Entwickler muss weiterhin handler ĂŒberprĂŒfen, die ausgewĂ€hlten Eigenschaften bestĂ€tigen, GeschĂ€ftsregeln hinzufĂŒgen, Validierungen anpassen und ĂŒberprĂŒfen, ob der Anwendungsfall die Grenzen des Moduls und des Dienstes respektiert.

Wichtig: Lino-Projekte können mit UnterstĂŒtzung fĂŒr CQRS und mediator erstellt werden. Die generierten Commands und Queries verwenden Anwendungsabstraktionen wie ICommand, IQuery, ICommandHandler, IQueryHandler Und Tolitech.Results die Bearbeitung von Anfragen und Betriebsergebnissen zu standardisieren.

AnwendungsfallĂŒbersicht

Eins Anwendungsfall stellt einen vollstĂ€ndigen Anwendungsvorgang dar: empfĂ€ngt ein Eingabemodell, validiert die Daten, koordiniert AbhĂ€ngigkeiten, ruft bei Bedarf DomĂ€nenverhalten auf, behĂ€lt Daten bei oder fragt sie ab und gibt ein standardisiertes Ergebnis zurĂŒck. Hier orchestriert die Anwendung einen GeschĂ€ftsablauf, ohne Invarianten aus dem DomĂ€nenmodell zu verschieben.

In von Lino generierten Lösungen werden AnwendungsfÀlle im Anwendungsprojekt anhand einer vorhersehbaren Struktur gruppiert:

src/Services/<ServiceName>/<ModuleName>/Application/UseCases/<EntityName>/
├── Commands/
│   └── <CommandName>/
└── Queries/
    └── <QueryName>/

Diese Organisation macht deutlich, zu welchem ​​Dienst, Modul und welcher EntitĂ€t jedes Feature gehört. Außerdem bleibt das Schreibmodell und das Lesemodell unabhĂ€ngig, was nĂŒtzlich ist, wenn ein Bildschirm, API, eine Integration oder ein Hintergrundprozess nur eine Seite des Verhaltens benötigt.

Command oder Query?

Typ Absicht Beispiele common Resultado
Command Ändern Sie den Systemstatus. CreateOrder, UpdateVehicle, DeleteMaintenance, SavePermissionsByRoleId. Result, Result<CommandResult> oder no-content bei Erfolg.
Query Daten lesen, ohne den Status zu Àndern. GetOrderById, ListCustomers, GetVehicleAvailability. Result<QueryResult>, Liste, Seite oder verbraucherspezifischer DTO.

Was zum Anwendungsfall gehört

  • Eintrittsvertrag: der record von command oder query mit nur den fĂŒr den Vorgang erforderlichen Daten.
  • Validierung: Regeln, die das Anforderungsformat, erforderliche Felder, Bereiche, Bezeichner, Filter und andere EingabebeschrĂ€nkungen ĂŒberprĂŒfen, bevor handler den Flow ausfĂŒhrt.
  • handler-Orchestrierung: Aufrufe von AbhĂ€ngigkeiten, Zugriff auf Repositorys, Kontextabfragen, Verwendung von Unit of Work, Ergebniszusammensetzung, Protokollierung und Ablaufverfolgung.
  • Ergebnisvertrag: ein kleines Antwortobjekt oder inhaltsloses Ergebnis, das caller genau das gibt, was es zum Fortfahren benötigt.

Was sollte im Anwendungsfall weggelassen werden?

  • DomĂ€neninvarianten muss in EntitĂ€ten, Value Objects, DomĂ€nendiensten und DomĂ€nenmethoden verbleiben.
  • Details zur Infrastruktur Sie mĂŒssen hinter Abstraktionen, Repositorys, Datenbankkontexten, Dateidiensten, Messaging-Integrationen und externen Clients bleiben.
  • Bedenken hinsichtlich der PrĂ€sentationB. UI-Status, Beschriftungen, Layouts und Komponentenverhalten, mĂŒssen in der Web-App-Ebene verbleiben.

Ein guter Anwendungsfall ist explizit, klein genug, um verstanden zu werden, und streng mit Grenzen: Er koordiniert die Arbeit, wird aber nicht zu einem Ort, an dem alle Systemregeln durcheinander geraten.

Commands

Eins Command ist eine unverĂ€nderliche Nachricht, die nur die Daten enthĂ€lt, die zum AusfĂŒhren einer Aktion erforderlich sind, die den Zustand des Systems Ă€ndert. GĂ€ngige Beispiele sind CreateCustomer, UpdateVehicle, DeleteMaintenance, ConfirmOrder Und SavePermissionsByRoleId. Commands sollten benannte Aktionen sein, da sie der Anwendung mitteilen, etwas zu tun.

In Lino, Commands werden records generiert, die die Abstraktion von command implementieren und ein standardisiertes Ergebnis zurĂŒckgeben. Die Erstellung Commands gibt normalerweise ein Ergebnisobjekt mit dem Bezeichner oder den Mindestinformationen zurĂŒck, die fĂŒr caller erforderlich sind, wĂ€hrend das Aktualisieren und Löschen commands normalerweise no-content zurĂŒckgibt, wenn der Vorgang erfolgreich abgeschlossen wurde.

Merkmale eines Command

  • UnverĂ€nderlichkeit: implementiert als record oder Klasse mit nur get, ohne verĂ€nderliche öffentliche Setter.
  • Name im Imperativ: spiegelt geschĂ€ftliche Maßnahmen wider, wie z CreateOrder, UpdateCustomerAddress oder ChangeProductPrice.
  • Mindestdaten: EnthĂ€lt nur die Felder, die zum AusfĂŒhren des Vorgangs erforderlich sind, ohne dass ganze EntitĂ€ten oder große Datenmengen transportiert werden.
  • Isolierte Validierung: Jeder Command hat seine eigenen Regeln, um sicherzustellen, dass die Anfrage konsistent ist, bevor sie handler erreicht.
  • UnabhĂ€ngigkeit von UI: Command stellt die Absicht der Anwendung dar, nicht die SchaltflĂ€che, das Formular oder die Komponente, die den Vorgang ausgelöst hat.

Wann muss ein Command erstellt werden?

  • Verwenden Sie einen Command, wenn Daten erstellt, geĂ€ndert, entfernt, verbunden, importiert, genehmigt, storniert oder auf irgendeine Weise verĂ€ndert werden.
  • Konzentrieren Sie payload auf den Vorgang. Übergeben Sie nicht eine ganze EntitĂ€t, wenn nur wenige Felder ausreichen.
  • WĂ€hlen Sie Namen, die die GeschĂ€ftsaktion beschreiben, nicht das visuelle Ereignis, das sie ausgelöst hat.
  • ÜberprĂŒfen Sie, ob die Aktion zum aktuellen Modul gehört oder ob sie durch Integration, Ereignis oder SchattenentitĂ€t in einem anderen Modul ausgedrĂŒckt werden soll.

Command Validators

Du Command Validators Stellen Sie sicher, dass Command wohlgeformt ist und die Einreisebestimmungen erfĂŒllt, bevor es an handler gesendet wird. In Lino werden diese Validierungen mit implementiert FluentValidation, eine gemeinsame Bibliothek in .NET-Projekten, da sie ein flĂŒssiges und lesbares API zum Erstellen von Regeln bietet.

Gemeinsame Validierungsregeln

  • NotEmpty Und NotNull fĂŒr Pflichtfelder.
  • InclusiveBetween fĂŒr Zahlenbereiche, Geldwerte, ProzentsĂ€tze, Mindest- und Höchstmengen.
  • MaximumLength, MinimumLength Und Length fĂŒr die SaitengrĂ¶ĂŸe.
  • RuleForEach zur Validierung von SammlungsgegenstĂ€nden, wie z List<T>.
  • Must fĂŒr benutzerdefinierte Regeln wie Dokumentformat, Datumskonsistenz und ungĂŒltige Feldkombinationen.

validator schĂŒtzt die Vorderkante. TatsĂ€chliche DomĂ€neninvarianten wie Zustandsgrenzen, zulĂ€ssige ÜbergĂ€nge und Regeln, die unabhĂ€ngig von caller gelten mĂŒssen, gehören weiterhin zum aggregate, zur EntitĂ€t, zum Value Object oder zum DomĂ€nendienst.

Command Handlers

DER Command Handler fĂŒhrt die mit Command verknĂŒpfte Anwendungslogik aus. Es orchestriert Repositories, Kontexte, IUnitOfWork, Hilfsdienste, Protokollierung, Ablaufverfolgung, Integrationsaufrufe und DomĂ€nenereignisse bei Bedarf.

Implementierungsmuster fĂŒr einen handler

  • Empfangen Sie AbhĂ€ngigkeiten ĂŒber die AbhĂ€ngigkeitsinjektion, z. B. Repositorys, externe Dienste, Kontexte und Unit of Work.
  • ÜberprĂŒfen Sie die Existenz und VerfĂŒgbarkeit der fĂŒr den Vorgang erforderlichen Daten.
  • Laden Sie den richtigen aggregate oder die richtige EntitĂ€t, wenn der Vorgang vom vorhandenen Status abhĂ€ngt.
  • Rufen Sie DomĂ€nenmethoden auf, anstatt Invarianten in handler zu duplizieren.
  • Behalten Sie Änderungen bei IUnitOfWork oder Projektpersistenzabstraktionen.
  • Protokollieren Sie DomĂ€nen-, Outbox- oder Integrationsereignisse, wenn der Vorgang mit anderen Teilen des Systems kommunizieren muss.
  • ZurĂŒckkehren Result oder Result<T> Erfolg, bekannter Fehler oder minimale Antwortdaten.

Command Results und Result Pattern

DER Command Result sollte ein einfacher DTO mit nur den Daten sein, die fĂŒr den Fortgang von caller erforderlich sind. In der Schöpfung umfasst es normalerweise die Id generiert. Beim Aktualisieren oder Löschen ist möglicherweise kein payload vorhanden. Wenn der Vorgang aufgrund einer erwarteten Bedingung fehlschlĂ€gt, muss die RĂŒckgabe standardisierte Fehlerinformationen enthalten.

DER Result Pattern kapselt das Ergebnis einer Operation als Erfolg oder Misserfolg. Anstatt Ausnahmen fĂŒr vorhersehbare Szenarien wie nicht gefundene EntitĂ€t, ungĂŒltigen Status oder GeschĂ€ftsvalidierung auszulösen, gibt handler einen Typ wie „ Result<T> mit Wert, Fehler und Metadaten, sofern erforderlich.

  • Bei Erfolg kann das Ergebnis Folgendes anzeigen: Value, wie etwa ein kleiner DTO oder ein manipulierter Bezeichner.
  • Bei einem Fehler werden im Ergebnis standardisierte Codes oder Meldungen gespeichert, die hĂ€ufig in wiederverwendbaren Fehlerdefinitionen definiert sind.
  • Der Fehlerbehandlungsablauf ist zwischen Application, API, typed clients und UI konsistent.

Erstellen eines Command mit CLI

Lino vereinfacht die Generierung der notwendigen Artefakte fĂŒr ein neues Command durch den Befehl:

lino command new

CLI unterstĂŒtzt auch Optionen zur Reduzierung von Fragen im Assistenten:

lino command new --service <ServiceName> --module <ModuleName> --entity <EntityName> --name <CommandName>
lino command new --name <CommandName> --service <ServiceName> --module <ModuleName> --entity <EntityName>
lino command list --service <ServiceName> --module <ModuleName> --entity <EntityName>
  • -s oder --service: Zieldienst.
  • -m oder --module: Zielmodul in modularisierten Diensten.
  • -e oder --entity: EntitĂ€t, die mit Command verknĂŒpft ist.
  • -n, --name, -c oder --command: Name von Command.

WÀhrend des interaktiven Ablaufs bestÀtigt Lino Dienst, Modul, EntitÀt, Command-Name, Command-Typ und bei Erstellungs- oder AktualisierungsvorgÀngen die Eigenschaften, die Teil der Anforderung sein werden. Die von CLI bereitgestellten Typen sind Erstellen, Aktualisieren Und Löschen.

Nach der BestÀtigung erstellt Lino Dateien wie:

  • CreateOrderCommand.cs
  • CreateOrderCommandValidator.cs
  • CreateOrderCommandHandler.cs
  • CreateOrderCommandResult.cs

Beispiel einer generierten Struktur

Betrachten Sie Command CreatePerson. Die generierte Struktur sieht folgendermaßen aus:

<ProjectName>/
└── src/
    └── Services/
        └── <ServiceName>/
            └── Application/
                ├── <ProjectName>.<ServiceName>.Application.csproj
                └── UseCases/
                    └── People/
                        ├── Commands/
                        │   └── CreatePerson/
                        │       ├── CreatePersonCommand.cs
                        │       ├── CreatePersonCommandValidator.cs
                        │       ├── CreatePersonCommandHandler.cs
                        │       └── CreatePersonCommandResult.cs
                        └── Queries/
                            └── ...

FĂŒr eine angepasste Flotte Command folgt die Struktur demselben Muster:

Application/UseCases/Vehicles/Commands/UpdateVehicle/
├── UpdateVehicleCommand.cs
├── UpdateVehicleCommandValidator.cs
├── UpdateVehicleCommandHandler.cs
└── UpdateVehicleCommandResult.cs

Verantwortlichkeiten von Command-Dateien

  • Command: unverĂ€nderlicher Anforderungsvertrag mit der Eingabe der Operation.
  • Validator: Eingabevalidierung, typischerweise mit verbindlichen Regeln, GrĂ¶ĂŸe, Bereich, Bezeichnern und Sammlungen.
  • Handler: Orchestrierung von Repositorys, Unit of Work, Kontexten, DomĂ€nenmethoden, Protokollierung, Ablaufverfolgung und Ergebniserstellung.
  • Result: Mindestantwortvertrag fĂŒr erfolgreiche VorgĂ€nge, die Daten zurĂŒckgeben mĂŒssen.

Checkliste fĂŒr die Umsetzung

  1. Laufen lino command new und wÀhlen Sie den richtigen Dienst, das richtige Modul, die richtige EntitÀt, den richtigen Typ und die richtigen Eigenschaften aus.
  2. Öffnen Sie den generierten Command und entfernen Sie alle Felder, die nicht Teil des Betriebsvertrags sind.
  3. StÀrken Sie validator mit GeschÀftseintrittsregeln, die nicht automatisch abgeleitet werden können.
  4. ÜberprĂŒfen Sie handler und stellen Sie sicher, dass es DomĂ€nenverhalten hervorruft, anstatt Invarianten auf der Anwendungsebene zu duplizieren.
  5. Verwenden IUnitOfWork fĂŒr Persistenz und bevorzugen transaktionales Speichern, wenn der Vorgang auch Ereignisse oder zuverlĂ€ssige Outbox erfordert.
  6. RĂŒckgabefehler aufgrund von Fehlern Result, nicht durch Ausnahmen von den erwarteten GeschĂ€ftsergebnissen.
  7. Erstellen und testen Sie den Endpunkt, die Seite oder die Integration, die Command aufruft.

Faustregel: Der Generator liefert das architektonische GrundgerĂŒst. Die endgĂŒltige Lösung ergibt sich aus der ÜberprĂŒfung des Anwendungsfalls anhand der DomĂ€nensprache, der Invarianten, der Persistenzanforderungen und der Modulgrenzen.

Queries

Eins Query stellt die Absicht dar, Daten abzurufen, ohne den Status der DomĂ€ne zu Ă€ndern. Queries sind fĂŒr effizientes Lesen konzipiert und geben genau die von caller benötigten Felder zurĂŒck, ohne ganze EntitĂ€ten zu laden, wenn dies nicht erforderlich ist.

GÀngige Beispiele sind GetCustomerById, ListCustomers, ListPhoneTypes, ListOrdersByDateRange und ein benutzerdefiniertes query-GefÀllt mir GetVehicleAvailability. Ein Query muss eine anwendungsspezifische Frage beantworten.

Merkmale eines Query

  • UnverĂ€nderlich: Genau wie Commands darf ein Query nach seiner Erstellung keine Änderungen zulassen.
  • Beschreibender Name: spiegelt die gesuchten Informationen wider, z GetCustomerById oder ListOrdersByDateRange.
  • Filter und Paginierung: kann Daten, Status, Seite, SeitengrĂ¶ĂŸe, Suchtext, Reihenfolge und andere Leseparameter laden.
  • Vorsprung: muss DTO zurĂŒckgeben oder das Modell nur mit den erforderlichen Feldern anzeigen, um eine direkte Offenlegung von DomĂ€nenentitĂ€ten zu vermeiden.
  • Keine Nebenwirkungen: Sie dĂŒrfen keine Methoden aufrufen, die den Status Ă€ndern oder Änderungen in der Datenbank speichern.

Wann muss ein Query erstellt werden?

  • Verwenden Sie einen Query, wenn der Vorgang Daten liest und den Status nicht Ă€ndern soll.
  • Verwenden Sie einen Einzelergebnis-Query fĂŒr Detailbildschirme, Bezeichnersuchen, VerfĂŒgbarkeitsprĂŒfungen oder Objektantworten.
  • Verwenden Sie eine Liste Query fĂŒr Raster, Auswahllisten, untergeordnete Sammlungen und Auswahlsteuerelemente.
  • Verwenden Sie Paginierung fĂŒr Raster und potenziell große DatensĂ€tze.
  • Verwenden Sie einfache Listen fĂŒr kleine Referenzdaten, AufzĂ€hlungen und Optionsendpunkte.

Query Validators

Du Query Validators Validieren Sie Eingabeparameter wie Filter, Paginierungswerte, Datumsbereiche, Bezeichner und Sichtbarkeitsregeln. Sie werden auch mit implementiert FluentValidation.

Allgemeine Validierungsregeln in Queries

  • GreaterThanOrEqualTo Und LessThanOrEqualTo fĂŒr Bereichsfilter wie Start- und Enddatum.
  • Length, MaximumLength Und MinimumLength fĂŒr Textfilter wie Name, E-Mail oder Suchbegriff.
  • InclusiveBetween fĂŒr Paging, Begrenzung page Und pageSize.
  • NotEmpty fĂŒr obligatorische Identifikatoren in Detailabfragen.
  • Must fĂŒr ungĂŒltige Filterkombinationen, z. B. Enddatum vor dem Startdatum.

Query Handlers

DER Query Handler Fragt Repositorys oder Datenbankkontext ab und gibt optimierte Projektionen zurĂŒck. In Lino wird empfohlen, Projektionen mit zu verwenden Select, explizite Filter, vorhersehbare Reihenfolge und gegebenenfalls nicht verfolgte Messwerte.

Der handler von Query muss read-only sein: Er ruft keine zustandsverĂ€ndernden DomĂ€nenmethoden auf, löst keine dauerhaften Änderungen aus und wird nicht ausgefĂŒhrt SaveChanges. Wenn bei einem Lesevorgang ein Audit protokolliert, eine Integration initiiert oder der Status neu berechnet werden muss, weist dies normalerweise auf einen anderen Anwendungsfall oder einen separaten Prozess hin.

Query Results

In Lino werden Ergebnisse von Queries durch records dargestellt, die mit dem Suffix benannt sind QueryResult. Diese Konvention gilt fĂŒr Einzelantworten, einfache Listen, Seitenlisten oder bildschirmspezifische DTO, API, Integrations- oder Hintergrundprozesse.

ResultAbfragedaten mĂŒssen lesestabile VertrĂ€ge sein. Behandeln Sie sie als DTOs, die fĂŒr den Verbraucher entwickelt wurden, und nicht als AbkĂŒrzung fĂŒr die direkte Offenlegung von DomĂ€nenentitĂ€ten.

Erstellen eines Query mit CLI

Ähnlich wie Commands stellt Lino den Befehl bereit:

lino query new

CLI akzeptiert auch Optionen wie:

lino query new --service <ServiceName> --module <ModuleName> --entity <EntityName> --name <QueryName>
lino query new --name <QueryName> --service <ServiceName> --module <ModuleName> --entity <EntityName>
lino query list --service <ServiceName> --module <ModuleName> --entity <EntityName>
  • -s oder --service: Zieldienst.
  • -m oder --module: Zielmodul.
  • -e oder --entity: EntitĂ€t, die mit Query verknĂŒpft ist.
  • -n, --name, -q oder --query: Name von Query.

WĂ€hrend des interaktiven Ablaufs fragt Lino, ob Query ein einzelnes Ergebnis oder eine Liste zurĂŒckgibt. Wenn es sich bei der Antwort um eine Liste handelt, wird auch gefragt, ob sie paginiert werden soll. Schließlich können Sie die Eigenschaften auswĂ€hlen, die von der generierten Projektion zurĂŒckgegeben oder verwendet werden sollen.

Lino generiert automatisch:

  • GetOrderByIdQuery.cs
  • GetOrderByIdQueryValidator.cs
  • GetOrderByIdQueryHandler.cs
  • GetOrderByIdQueryResult.cs

Beispiel einer generierten Struktur fĂŒr Queries

<ProjectName>/
└── src/
    └── Services/
        └── <ServiceName>/
            └── Application/
                ├── <ProjectName>.<ServiceName>.Application.csproj
                └── UseCases/
                    └── Orders/
                        ├── Commands/
                        |   └── ...
                        └── Queries/
                            └── GetOrderById/
                                ├── GetOrderByIdQuery.cs
                                ├── GetOrderByIdQueryValidator.cs
                                ├── GetOrderByIdQueryHandler.cs
                                └── GetOrderByIdQueryResult.cs

FĂŒr eine maßgeschneiderte FahrzeugverfĂŒgbarkeit Query folgt die Struktur demselben Muster:

Application/UseCases/Vehicles/Queries/GetVehicleAvailability/
├── GetVehicleAvailabilityQuery.cs
├── GetVehicleAvailabilityQueryValidator.cs
├── GetVehicleAvailabilityQueryHandler.cs
└── GetVehicleAvailabilityQueryResult.cs

Verantwortlichkeiten von Query-Dateien

  • Query: unverĂ€nderlicher Anforderungsvertrag mit Kennungen, Filtern, Reihenfolge, Paginierung oder Datumsbereichen.
  • Validator: Validierung von Bezeichnern, Paginierung, obligatorischen Filtern, Datumsbereichen und Suchkriterien.
  • Handler: Lesen der Orchestrierung mithilfe von Anwendungskontext, Projektionen, Filtern, Reihenfolge, Paginierung, Protokollierung, Ablaufverfolgung und Ergebniserstellung.
  • Result: Antwort DTO nach dem Vorbild von caller, hĂ€ufig mit internen records fĂŒr Listenelemente.

Checkliste fĂŒr die Umsetzung

  1. Laufen lino query new und wĂ€hlen Sie Dienst, Modul, EntitĂ€t, Query-Namen, RĂŒckgabetyp, Paging-Modus und Eigenschaften.
  2. ÜberprĂŒfen Sie den Anfragevertrag und behalten Sie nur Filter bei, die fĂŒr caller wirklich notwendig sind.
  3. StĂ€rken Sie validator, insbesondere fĂŒr erforderliche Kennungen, Datumsbereiche, SeitengrĂ¶ĂŸenbeschrĂ€nkungen und ungĂŒltige Filterkombinationen.
  4. Passen Sie die handler-Projektion an, um nur die Felder zurĂŒckzugeben, die fĂŒr UI, API, Integration oder Hintergrundprozess erforderlich sind.
  5. Behalten Sie Query read-only bei: Rufen Sie keine DomĂ€nenmethoden auf, die den Status Ă€ndern, und speichern Sie keine Änderungen in handler.
  6. Erwartete Fehler ĂŒberall verbreiten Result, wobei gegebenenfalls vorhandene standardisierte Fehler verwendet werden.
  7. Erstellen und testen Sie den Verbraucher, der Query aufruft, z. B. API Endpunkt, Blazor-Seite, In-Process-Integration oder typed client.

Beispiel fĂŒr benutzerdefiniertes Query

Im Integrationsfluss zwischen SaaS-Modulen kann eine individuelle FahrzeugverfĂŒgbarkeit Query erstellt werden lino query new. Die generierte Struktur stellt Query, Handler, Result und Validator bereit. Anschließend fĂŒgt der Entwickler die erforderlichen Eingaben wie Fahrzeugkennung, Startdatum und Enddatum hinzu, ĂŒberprĂŒft, ob der Bereich korrekt ist, und implementiert die handler-Logik. Dies ist der erwartete Ablauf: Generieren Sie zuerst die konsistente Struktur und vervollstĂ€ndigen Sie dann das domĂ€nenspezifische Verhalten mit explizitem Code.

Modellanleitung lesen: Ergebnisse von Query mĂŒssen stabile VertrĂ€ge sein. Behandeln Sie sie als DTOs, die fĂŒr caller entwickelt wurden, und nicht als VerknĂŒpfung zum direkten Offenlegen von DomĂ€nenentitĂ€ten.

Abschluss

Durch die Definition von AnwendungsfĂ€llen in Lino wird das DomĂ€nenmodell in klare Anwendungsoperationen umgewandelt. Commands verarbeitet ZustandsĂ€nderungen, Queries verarbeitet LesevorgĂ€nge, validators schĂŒtzt die Eingabekante, handlers orchestriert den Fluss und Ergebnisobjekte standardisieren die Ausgabe.

Der schnellste Ablauf ist in der Regel: Modellieren Sie die DomĂ€ne, generieren Sie die erforderlichen Commands und Queries, ĂŒberprĂŒfen Sie die generierten Dateien, vervollstĂ€ndigen Sie das GeschĂ€ftsverhalten, legen Sie den Anwendungsfall bei Bedarf ĂŒber einen API oder eine Seite offen und validieren Sie alles mit Build und Tests. Dadurch bleibt die Entwicklung schnell, ohne dass die Kontrolle ĂŒber die Architektur verloren geht.

Wenn das Projekt wÀchst, konzentrieren Sie sich bei jedem Anwendungsfall auf eine GeschÀftsabsicht, respektieren Sie Service- und Modulgrenzen und nutzen Sie Ereignisse, Integrationen oder SchattenentitÀten, wenn ein anderes Modul am Prozess teilnehmen muss.

Ein unbehandelter Fehler ist aufgetreten. Aktualisieren 🗙