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
recordoder Klasse mit nurget, ohne verĂ€nderliche öffentliche Setter. - Name im Imperativ: spiegelt geschĂ€ftliche MaĂnahmen wider, wie z
CreateOrder,UpdateCustomerAddressoderChangeProductPrice. - 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
NotEmptyUndNotNullfĂŒr Pflichtfelder.InclusiveBetweenfĂŒr Zahlenbereiche, Geldwerte, ProzentsĂ€tze, Mindest- und Höchstmengen.MaximumLength,MinimumLengthUndLengthfĂŒr die SaitengröĂe.RuleForEachzur Validierung von SammlungsgegenstĂ€nden, wie zList<T>.MustfĂŒ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
IUnitOfWorkoder Projektpersistenzabstraktionen. - Protokollieren Sie DomÀnen-, Outbox- oder Integrationsereignisse, wenn der Vorgang mit anderen Teilen des Systems kommunizieren muss.
- ZurĂŒckkehren
ResultoderResult<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>
-soder--service: Zieldienst.-moder--module: Zielmodul in modularisierten Diensten.-eoder--entity: EntitĂ€t, die mit Command verknĂŒpft ist.-n,--name,-coder--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.csCreateOrderCommandValidator.csCreateOrderCommandHandler.csCreateOrderCommandResult.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
- Laufen
lino command newund wĂ€hlen Sie den richtigen Dienst, das richtige Modul, die richtige EntitĂ€t, den richtigen Typ und die richtigen Eigenschaften aus. - Ăffnen Sie den generierten Command und entfernen Sie alle Felder, die nicht Teil des Betriebsvertrags sind.
- StÀrken Sie validator mit GeschÀftseintrittsregeln, die nicht automatisch abgeleitet werden können.
- ĂberprĂŒfen Sie handler und stellen Sie sicher, dass es DomĂ€nenverhalten hervorruft, anstatt Invarianten auf der Anwendungsebene zu duplizieren.
- Verwenden
IUnitOfWorkfĂŒr Persistenz und bevorzugen transaktionales Speichern, wenn der Vorgang auch Ereignisse oder zuverlĂ€ssige Outbox erfordert. - RĂŒckgabefehler aufgrund von Fehlern
Result, nicht durch Ausnahmen von den erwarteten GeschÀftsergebnissen. - 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
GetCustomerByIdoderListOrdersByDateRange. - 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
GreaterThanOrEqualToUndLessThanOrEqualTofĂŒr Bereichsfilter wie Start- und Enddatum.Length,MaximumLengthUndMinimumLengthfĂŒr Textfilter wie Name, E-Mail oder Suchbegriff.InclusiveBetweenfĂŒr Paging, BegrenzungpageUndpageSize.NotEmptyfĂŒr obligatorische Identifikatoren in Detailabfragen.MustfĂŒ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>
-soder--service: Zieldienst.-moder--module: Zielmodul.-eoder--entity: EntitĂ€t, die mit Query verknĂŒpft ist.-n,--name,-qoder--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.csGetOrderByIdQueryValidator.csGetOrderByIdQueryHandler.csGetOrderByIdQueryResult.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
- Laufen
lino query newund wĂ€hlen Sie Dienst, Modul, EntitĂ€t, Query-Namen, RĂŒckgabetyp, Paging-Modus und Eigenschaften. - ĂberprĂŒfen Sie den Anfragevertrag und behalten Sie nur Filter bei, die fĂŒr caller wirklich notwendig sind.
- StĂ€rken Sie validator, insbesondere fĂŒr erforderliche Kennungen, Datumsbereiche, SeitengröĂenbeschrĂ€nkungen und ungĂŒltige Filterkombinationen.
- Passen Sie die handler-Projektion an, um nur die Felder zurĂŒckzugeben, die fĂŒr UI, API, Integration oder Hintergrundprozess erforderlich sind.
- Behalten Sie Query read-only bei: Rufen Sie keine DomĂ€nenmethoden auf, die den Status Ă€ndern, und speichern Sie keine Ănderungen in handler.
- Erwartete Fehler ĂŒberall verbreiten
Result, wobei gegebenenfalls vorhandene standardisierte Fehler verwendet werden. - 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.
