アプリケーション Use Cases の定義
Use cases ã¯ãããžãã¹äžã®æå³ãå®è¡å¯èœãªãœãããŠã§ã¢ã«å€æããã¢ããªã±ãŒã·ã§ã³å±€ã®å
¥å£ã§ããLino ã§ã¯ãããã㯠Application/UseCases ã«é
眮ããããããžã§ã¯ãã®å段éã§å®çŸ©ããããšã³ãã£ãã£ãaggregatesãåæãã¢ãžã¥ãŒã«ããµãŒãã¹ãäžå¿ã«æŽçãããŸãã
Lino 㯠CQRS æåã®æ§é ã«åŸããŸããCommands ã¯ç¶æ ã倿Žããæäœã衚ããQueries ã¯ããŒã¿ãèªã¿åãæäœã衚ããŸãããã®åé¢ã«ãããæžã蟌ã¿ã«ãŒã«ãèªã¿åãã¢ãã«ãæ€èšŒãtracingãloggingãå¿çå¥çŽãæç€ºçã«ãªããä¿å®ãããããªããŸãã
Result Pattern ã¯ãæåã倱æããšã©ãŒã¡ãã»ãŒãžãçµæããŒã¿ãã«ãã»ã«åããŠãæäœã®æ»ãå€ãæšæºåããŸããæ³å®ãããããžãã¹ãããŒã«äŸå€ã䜿ã代ããã«ãhandler ã¯ç¶æ³ã«å¿ããŠå€ããšã©ãŒããŸã㯠no-content ãæã€ Result ãŸã㯠Result<T> ãè¿ããŸãã
CLI 㯠use case ã®åæãã¡ã€ã«ãçæããŸãããçæã³ãŒãã¯ãã¡ã€ã³åæã®ä»£ããã«ã¯ãªããŸãããéçºè ã¯åŒãç¶ã handler ãèŠçŽããéžæãããããããã£ã確èªããããžãã¹ã«ãŒã«ã远å ããæ€èšŒã調æŽããuse case ãã¢ãžã¥ãŒã«ãšãµãŒãã¹ã®å¢çãå°éããŠãããã確èªããå¿ èŠããããŸãã
éèŠ: Lino ãããžã§ã¯ã㯠CQRS ãš mediator ããµããŒãããŠäœæã§ããŸããçæããã Commands ãš Queries ã¯ããªã¯ãšã¹ãåŠçãšæäœçµæãæšæºåããããã«ãICommandãIQueryãICommandHandlerãIQueryHandlerãTolitech.Results ãªã©ã®ã¢ããªã±ãŒã·ã§ã³æœè±¡åã䜿çšããŸãã
Use Cases ã®æŠèŠ
Use Case ã¯ãã¢ããªã±ãŒã·ã§ã³ã®å®å šãªæäœã衚ããŸããå ¥åã¢ãã«ãåãåããããŒã¿ãæ€èšŒããäŸåé¢ä¿ã調æŽããå¿ èŠã«å¿ããŠãã¡ã€ã³ã®æ¯ãèããåŒã³åºããããŒã¿ãæ°žç¶åãŸãã¯ç §äŒããæšæºåãããçµæãè¿ããŸããããã¯ãäžå€æ¡ä»¶ããã¡ã€ã³ã¢ãã«ã®å€ãžç§»åãããã«ãã¢ããªã±ãŒã·ã§ã³ãããžãã¹ãããŒããªãŒã±ã¹ãã¬ãŒã·ã§ã³ããå Žæã§ãã
Lino ã«ãã£ãŠçæããããœãªã¥ãŒã·ã§ã³ã§ã¯ãuse cases ã¯äºæž¬å¯èœãªæ§é ã䜿ã£ãŠã¢ããªã±ãŒã·ã§ã³ãããžã§ã¯ãå ã«ã°ã«ãŒãåãããŸãã
src/Services/<ServiceName>/<ModuleName>/Application/UseCases/<EntityName>/
âââ Commands/
â âââ <CommandName>/
âââ Queries/
âââ <QueryName>/
ãã®æŽçã«ãããå feature ãã©ã®ãµãŒãã¹ãã¢ãžã¥ãŒã«ããšã³ãã£ãã£ã«å±ããããæç¢ºã«ãªããŸãããŸããæžã蟌ã¿ã¢ãã«ãšèªã¿åãã¢ãã«ãç¬ç«ãããŠããããããç»é¢ãAPIãçµ±åããŸã㯠background process ãæ¯ãèãã®çåŽã ããå¿ èŠãšããå Žåã«åœ¹ç«ã¡ãŸãã
Command ã Query ã
| çš®é¡ | æå³ | äŸ | äžè¬çãªçµæ |
|---|---|---|---|
| Command | ã·ã¹ãã ã®ç¶æ ã倿Žããã | CreateOrderãUpdateVehicleãDeleteMaintenanceãSavePermissionsByRoleIdã |
æåæã¯ ResultãResult<CommandResult>ããŸã㯠no-contentã |
| Query | ç¶æ ã倿Žããã«ããŒã¿ãèªã¿åãã | GetOrderByIdãListCustomersãGetVehicleAvailabilityã |
Result<QueryResult>ããªã¹ããããŒãžããŸãã¯ã³ã³ã·ã¥ãŒããŒå°çš DTOã |
ã¢ããªã±ãŒã·ã§ã³ use case ã«å±ãããã®
- å ¥åå¥çŽ: æäœã«å¿ èŠãªããŒã¿ã ããæã€ command ãŸã㯠query ã® recordã
- æ€èšŒ: handler ããããŒãå®è¡ããåã«ããªã¯ãšã¹ã圢åŒãå¿ é ãã£ãŒã«ããç¯å²ãèå¥åããã£ã«ã¿ãŒããã®ä»ã®å ¥åå¶çŽã確èªããã«ãŒã«ã
- handler ã®ãªãŒã±ã¹ãã¬ãŒã·ã§ã³: äŸåé¢ä¿ã®åŒã³åºãããªããžããªãžã®ã¢ã¯ã»ã¹ãã³ã³ããã¹ããžã®åãåãããUnit of Work ã®äœ¿çšãçµæã®çµã¿ç«ãŠãloggingãtracingã
- çµæå¥çŽ: caller ãç¶è¡ããããã«å¿ èŠãªãã®ãæ£ç¢ºã«æž¡ããå°ããªå¿çãªããžã§ã¯ããŸãã¯å 容ã®ãªãçµæã
use case ã®å€ã«çœ®ãã¹ããã®
- ãã¡ã€ã³äžå€æ¡ä»¶ ã¯ããšã³ãã£ãã£ãValue Objectsãdomain servicesããã¡ã€ã³ã¡ãœããã«æ®ãã¹ãã§ãã
- ã€ã³ãã©ã¹ãã©ã¯ãã£ã®è©³çް ã¯ãæœè±¡åããªããžããªãããŒã¿ããŒã¹ã³ã³ããã¹ãããã¡ã€ã«ãµãŒãã¹ãã¡ãã»ãŒãžã³ã°çµ±åãå€éš clients ã®èåŸã«çœ®ãã¹ãã§ãã
- ãã¬ãŒã³ããŒã·ã§ã³ã®é¢å¿äºãããšãã° UI ç¶æ ãlabelsãlayoutsãã³ã³ããŒãã³ãã®æ¯ãèãã¯ãweb app å±€ã«æ®ãã¹ãã§ãã
è¯ã use case ã¯æç€ºçã§ãçè§£ã§ããã ãååã«å°ãããå¢çã«å³å¯ã§ããäœæ¥ã調æŽããŸãããã·ã¹ãã ã®ãã¹ãŠã®ã«ãŒã«ãæ··ããå Žæã«ã¯ãªããŸããã
Commands
Command ã¯ãã·ã¹ãã ã®ç¶æ
ã倿Žããã¢ã¯ã·ã§ã³ãå®è¡ããããã«å¿
èŠãªããŒã¿ã ããéã¶äžå€ã®ã¡ãã»ãŒãžã§ããäžè¬çãªäŸã«ã¯ CreateCustomerãUpdateVehicleãDeleteMaintenanceãConfirmOrderãSavePermissionsByRoleId ããããŸããCommands ã¯ãã¢ããªã±ãŒã·ã§ã³ã«äœããå®è¡ããããã®ãªã®ã§ãã¢ã¯ã·ã§ã³ãšããŠåœåããå¿
èŠããããŸãã
Lino ã§çæããã Commands ã¯ãcommand æœè±¡åãå®è£ ããæšæºåãããçµæãè¿ã records ã§ããäœæçš Commands ã¯éåžžãçæãããèå¥åãŸã㯠caller ãå¿ èŠãšããæå°éã®æ å ±ãå«ãçµæãªããžã§ã¯ããè¿ããŸããäžæ¹ãæŽæ°çšããã³åé€çš commands ã¯ãæäœãæ£åžžã«å®äºããå Žåãéåžž no-content ãè¿ããŸãã
Command ã®ç¹åŸŽ
- äžå€æ§:
recordããŸãã¯getã®ã¿ãæã¡å€æŽå¯èœãª public setter ãæããªãã¯ã©ã¹ãšããŠå®è£ ããŸãã - åœä»€åœ¢ã®åå:
CreateOrderãUpdateCustomerAddressãChangeProductPriceã®ããã«ãããžãã¹äžã®ã¢ã¯ã·ã§ã³ãåæ ããŸãã - æå°éã®ããŒã¿: ãšã³ãã£ãã£å šäœã倧éã®ããŒã¿ãéã°ããæäœã®å®è¡ã«å¿ èŠãªãã£ãŒã«ãã ããå«ã¿ãŸãã
- åé¢ãããæ€èšŒ: å Command ã¯ãhandler ã«å°éããåã«ãªã¯ãšã¹ãã®æŽåæ§ãä¿èšŒããããã®ç¬èªã®ã«ãŒã«ãæã¡ãŸãã
- UI ããã®ç¬ç«: Command ã¯ãæäœãèµ·åãããã¿ã³ããã©ãŒã ãã³ã³ããŒãã³ãã§ã¯ãªããã¢ããªã±ãŒã·ã§ã³ã®æå³ã衚ããŸãã
Command ãäœæããã¿ã€ãã³ã°
- ããŒã¿ãäœæã倿Žãåé€ãé¢é£ä»ããã€ã³ããŒããæ¿èªããã£ã³ã»ã«ããŸãã¯äœããã®åœ¢ã§å€æŽããå Žå㯠Command ã䜿çšããŸãã
- payload ã¯æäœã«éäžãããŸããå°æ°ã®ãã£ãŒã«ãã§ååãªå Žåã«ããšã³ãã£ãã£å šäœãæž¡ããªãã§ãã ããã
- éå§å ã®èŠèŠçãªã€ãã³ãã§ã¯ãªããããžãã¹ã¢ã¯ã·ã§ã³ã説æããååãåªå ããŸãã
- ãã®ã¢ã¯ã·ã§ã³ãçŸåšã®ã¢ãžã¥ãŒã«ã«å±ããã®ããå¥ã¢ãžã¥ãŒã«ã®çµ±åãã€ãã³ãããŸã㯠shadow entity ãšããŠè¡šçŸãã¹ããªã®ããèŠçŽããŸãã
Command Validators
Command Validators ã¯ãCommand ã handler ã«éä¿¡ãããåã«ãæ£ãã圢æãããå ¥åèŠä»¶ãæºãããŠããããšãä¿èšŒããŸããLino ã§ã¯ããããã®æ€èšŒã¯ FluentValidation ã§å®è£ ãããŸããFluentValidation ã¯ãã«ãŒã«äœæã®ããã®æµæ¢ã§èªã¿ããã API ãæäŸããããã.NET ãããžã§ã¯ãã§ãã䜿ãããã©ã€ãã©ãªã§ãã
äžè¬çãªæ€èšŒã«ãŒã«
NotEmptyãšNotNullã¯å¿ é ãã£ãŒã«ãã«äœ¿çšããŸããInclusiveBetweenã¯æ°å€ç¯å²ãéé¡ãå²åãæå°æ°éãæå€§æ°éã«äœ¿çšããŸããMaximumLengthãMinimumLengthãLengthã¯æååã®é·ãã«äœ¿çšããŸããRuleForEachã¯List<T>ãªã©ãã³ã¬ã¯ã·ã§ã³å ã®é ç®ãæ€èšŒããããã«äœ¿çšããŸããMustã¯ãææžåœ¢åŒãæ¥ä»ã®æŽåæ§ãç¡å¹ãªãã£ãŒã«ãã®çµã¿åãããªã©ãã«ã¹ã¿ã ã«ãŒã«ã«äœ¿çšããŸãã
validator ã¯å ¥åå¢çãä¿è·ããŸããç¶æ ã®å¶éãèš±å¯ãããé·ç§»ãcaller ã«é¢ä¿ãªãæç«ãã¹ãã«ãŒã«ãªã©ãå®éã®ãã¡ã€ã³äžå€æ¡ä»¶ã¯ãåŒãç¶ã aggregateããšã³ãã£ãã£ãValue ObjectããŸã㯠domain service ã«å±ããŸãã
Command Handlers
Command Handler ã¯ãCommand ã«é¢é£ä»ããããã¢ããªã±ãŒã·ã§ã³ããžãã¯ãå®è¡ããŸããå¿
èŠã«å¿ããŠããªããžããªãã³ã³ããã¹ããIUnitOfWorkãè£å©ãµãŒãã¹ãloggingãtracingãçµ±ååŒã³åºãããã¡ã€ã³ã€ãã³ãããªãŒã±ã¹ãã¬ãŒã·ã§ã³ããŸãã
handler ã®å®è£ ãã¿ãŒã³
- ãªããžããªãå€éšãµãŒãã¹ãã³ã³ããã¹ããUnit of Work ãªã©ã®äŸåé¢ä¿ãäŸåæ§æ³šå ¥ã§åãåããŸãã
- æäœã«å¿ èŠãªããŒã¿ã®ååšãšå©çšå¯èœæ§ãæ€èšŒããŸãã
- æäœãæ¢åã®ç¶æ ã«äŸåããå Žåã¯ãæ£ãã aggregate ãŸãã¯ãšã³ãã£ãã£ãèªã¿èŸŒã¿ãŸãã
- handler å ã§äžå€æ¡ä»¶ãéè€ãããã®ã§ã¯ãªãããã¡ã€ã³ã¡ãœãããåŒã³åºããŸãã
IUnitOfWorkãŸãã¯ãããžã§ã¯ãã®æ°žç¶åæœè±¡åãéããŠå€æŽãä¿åããŸãã- æäœãã·ã¹ãã ã®ä»ã®éšåãžéç¥ããå¿ èŠãããå Žåã¯ããã¡ã€ã³ã€ãã³ããOutboxããŸãã¯çµ±åãç»é²ããŸãã
- æåãæ¢ç¥ã®å€±æããŸãã¯æå°éã®å¿çããŒã¿ãå«ã
ResultãŸãã¯Result<T>ãè¿ããŸãã
Command Results ãš Result Pattern
Command Result ã¯ãcaller ãç¶è¡ããããã«å¿
èŠãªããŒã¿ã ããæã€åçŽãª DTO ã§ããã¹ãã§ããäœæã§ã¯ãçæããã Id ãå«ãããšãäžè¬çã§ããæŽæ°ãŸãã¯åé€ã§ã¯ãpayload ããªãå ŽåããããŸããæäœãæ³å®ãããæ¡ä»¶ã«ãã£ãŠå€±æããå Žåãæ»ãå€ã¯æšæºåããããšã©ãŒæ
å ±ãä¿æããå¿
èŠããããŸãã
Result Pattern ã¯ãæäœã®çµæãæåãŸãã¯å€±æãšããŠã«ãã»ã«åããŸãããšã³ãã£ãã£ãèŠã€ãããªããç¶æ
ãç¡å¹ã§ãããããžãã¹æ€èšŒã«å€±æãããªã©ã®äºæž¬å¯èœãªã·ããªãªã§äŸå€ãæãã代ããã«ãhandler ã¯å¿
èŠã«å¿ããŠå€ããšã©ãŒãã¡ã¿ããŒã¿ãæã€ Result<T> ã®ãããªåãè¿ããŸãã
- æåæãçµæã¯å°ã㪠DTO ãäœæãããèå¥åãªã©ã®
Valueãå ¬éã§ããŸãã - 倱ææãçµæã¯æšæºåãããã³ãŒããŸãã¯ã¡ãã»ãŒãžãä¿æããŸããå€ãã®å Žåããããã¯åå©çšå¯èœãª error definitions ã§å®çŸ©ãããŸãã
- ãšã©ãŒåŠçã®æµãã¯ãApplicationãAPIãtyped clientsãUI ã®éã§äžè²«ããŸãã
CLI ã§ Command ãäœæãã
Lino ã¯ã次ã®ã³ãã³ããéããŠæ°ãã Command ã«å¿ èŠãªã¢ãŒãã£ãã¡ã¯ãã®çæãç°¡åã«ããŸãã
lino command new
CLI ã¯ãã¢ã·ã¹ã¿ã³ãã§ã®è³ªåãæžããããã®ãªãã·ã§ã³ãåãä»ããŸãã
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ãŸãã¯--service: 察象ãµãŒãã¹ã-mãŸãã¯--module: ã¢ãžã¥ãŒã«åããããµãŒãã¹å ã®å¯Ÿè±¡ã¢ãžã¥ãŒã«ã-eãŸãã¯--entity: Command ã«é¢é£ä»ãããããšã³ãã£ãã£ã-nã--nameã-cããŸãã¯--command: Command ã®ååã
察話ãããŒäžãLino ã¯ãµãŒãã¹ãã¢ãžã¥ãŒã«ããšã³ãã£ãã£ãCommand åãCommand ã®çš®é¡ããããŠäœæãŸãã¯æŽæ°æäœã§ã¯ãªã¯ãšã¹ãã«å«ããããããã£ã確èªããŸããCLI ãå ¬éããçš®é¡ã¯ CreateãUpdateãDelete ã§ãã
確èªåŸãLino ã¯æ¬¡ã®ãããªãã¡ã€ã«ãäœæããŸãã
CreateOrderCommand.csCreateOrderCommandValidator.csCreateOrderCommandHandler.csCreateOrderCommandResult.cs
çæãããæ§é ã®äŸ
Command CreatePerson ãèããŸããçæãããæ§é ã¯æ¬¡ã®ããã«ãªããŸãã
<ProjectName>/
âââ src/
âââ Services/
âââ <ServiceName>/
âââ Application/
âââ <ProjectName>.<ServiceName>.Application.csproj
âââ UseCases/
âââ People/
âââ Commands/
â âââ CreatePerson/
â âââ CreatePersonCommand.cs
â âââ CreatePersonCommandValidator.cs
â âââ CreatePersonCommandHandler.cs
â âââ CreatePersonCommandResult.cs
âââ Queries/
âââ ...
fleet ã®ã«ã¹ã¿ã Command ã§ããæ§é ã¯åããã¿ãŒã³ã«åŸããŸãã
Application/UseCases/Vehicles/Commands/UpdateVehicle/ âââ UpdateVehicleCommand.cs âââ UpdateVehicleCommandValidator.cs âââ UpdateVehicleCommandHandler.cs âââ UpdateVehicleCommandResult.cs
Command ãã¡ã€ã«ã®è²¬å
- Command: æäœã®å ¥åãæã€äžå€ã®ãªã¯ãšã¹ãå¥çŽã
- Validator: å ¥åæ€èšŒãéåžžã¯å¿ é ãé·ããç¯å²ãèå¥åãã³ã¬ã¯ã·ã§ã³ã«é¢ããã«ãŒã«ãå«ã¿ãŸãã
- Handler: ãªããžããªãUnit of Workãã³ã³ããã¹ãããã¡ã€ã³ã¡ãœãããloggingãtracingãçµæäœæã®ãªãŒã±ã¹ãã¬ãŒã·ã§ã³ã
- Result: ããŒã¿ãè¿ãå¿ èŠãããæåæäœã®ããã®æå°éã®å¿çå¥çŽã
å®è£ ãã§ãã¯ãªã¹ã
lino command newãå®è¡ããæ£ãããµãŒãã¹ãã¢ãžã¥ãŒã«ããšã³ãã£ãã£ãçš®é¡ãããããã£ãéžæããŸãã- çæããã Command ãéããæäœå¥çŽã®äžéšã§ã¯ãªããã£ãŒã«ãããã¹ãŠåé€ããŸãã
- èªåçã«æšè«ã§ããªãããžãã¹å ¥åã«ãŒã«ã§ validator ã匷åããŸãã
- handler ãèŠçŽããã¢ããªã±ãŒã·ã§ã³å±€ã§äžå€æ¡ä»¶ãéè€ãããã®ã§ã¯ãªãããã¡ã€ã³ã®æ¯ãèããåŒã³åºããŠããããšã確èªããŸãã
- æ°žç¶åã«ã¯
IUnitOfWorkã䜿çšããæäœãã€ãã³ããŸãã¯ä¿¡é Œæ§ã®é«ã Outbox ãå¿ èŠãšããå Žåã¯ããã©ã³ã¶ã¯ã·ã§ã³ä¿åãåªå ããŸãã - æ³å®ãããããžãã¹çµæã«ã€ããŠã¯ãäŸå€ã§ã¯ãªã
Resultã®ãšã©ãŒãšããŠå€±æãè¿ããŸãã - Command ãåŒã³åºã endpointãããŒãžããŸãã¯çµ±åããã«ãããŠãã¹ãããŸãã
å®çšçãªç®å®: generator ã¯ã¢ãŒããã¯ãã£ã®éªšæ ŒãæäŸããŸããæçµçãªæ£ããã¯ããã¡ã€ã³èšèªãäžå€æ¡ä»¶ãæ°žç¶åã®èŠä»¶ãã¢ãžã¥ãŒã«å¢çã«ç §ãã㊠use case ãèŠçŽãããšã§åŸãããŸãã
Queries
Query ã¯ããã¡ã€ã³ã®ç¶æ ã倿Žããã«ããŒã¿ãååŸããæå³ã衚ããŸããQueries ã¯å¹ççãªèªã¿åãã®ããã«èšèšãããäžèŠãªå Žåã«ãšã³ãã£ãã£å šäœãèªã¿èŸŒãŸããcaller ã«å¿ èŠãªãã£ãŒã«ãã ããè¿ããŸãã
äžè¬çãªäŸã«ã¯ GetCustomerByIdãListCustomersãListPhoneTypesãListOrdersByDateRangeããã㊠GetVehicleAvailability ã®ãããªã«ã¹ã¿ã query ããããŸããQuery ã¯ãã¢ããªã±ãŒã·ã§ã³ã®å
·äœçãªåãã«çããã¹ãã§ãã
Query ã®ç¹åŸŽ
- äžå€: Commands ãšåæ§ã«ãQuery ã¯äœæåŸã®å€æŽãèš±å¯ãã¹ãã§ã¯ãããŸããã
- 説æçãªåå:
GetCustomerByIdãListOrdersByDateRangeã®ããã«ãååŸããæ å ±ãåæ ããŸãã - ãã£ã«ã¿ãŒãšããŒãžã³ã°: æ¥ä»ãã¹ããŒã¿ã¹ãããŒãžãããŒãžãµã€ãºãæ€çŽ¢ããã¹ãã䞊ã³é ããã®ä»ã®èªã¿åããã©ã¡ãŒã¿ãŒãæã€ããšãã§ããŸãã
- ãããžã§ã¯ã·ã§ã³: å¿ èŠãªãã£ãŒã«ãã ããæã€ DTO ãŸã㯠view model ãè¿ãããã¡ã€ã³ãšã³ãã£ãã£ã®çŽæ¥å ¬éãé¿ããã¹ãã§ãã
- å¯äœçšãªã: ç¶æ ã倿Žããã¡ãœãããåŒã³åºããããããŒã¿ããŒã¹ã«å€æŽãä¿åããããã¹ãã§ã¯ãããŸããã
Query ãäœæããã¿ã€ãã³ã°
- æäœãããŒã¿ãèªã¿åããç¶æ ã倿Žãã¹ãã§ãªãå Žå㯠Query ã䜿çšããŸãã
- 詳现ç»é¢ãèå¥åã«ããæ€çŽ¢ãå¯çšæ§ãã§ãã¯ããŸãã¯åäžãªããžã§ã¯ãã®å¿çã«ã¯ãåäžçµæã® Query ã䜿çšããŸãã
- gridsãéžæè¢ãªã¹ããåã³ã¬ã¯ã·ã§ã³ãéžæã³ã³ãããŒã«ã«ã¯ããªã¹ã Query ã䜿çšããŸãã
- grids ãæœåšçã«å€§ããªããŒã¿ã»ããã«ã¯ããŒãžã³ã°ã䜿çšããŸãã
- å°ããªåç §ããŒã¿ãåæããªãã·ã§ã³ endpoints ã«ã¯åçŽãªãªã¹ãã䜿çšããŸãã
Query Validators
Query Validators ã¯ããã£ã«ã¿ãŒãããŒãžã³ã°å€ãæ¥ä»ç¯å²ãèå¥åãå¯èŠæ§ã«ãŒã«ãªã©ã®å ¥åãã©ã¡ãŒã¿ãŒãæ€èšŒããŸãããããã FluentValidation ã§å®è£ ãããŸãã
Queries ã§äžè¬çãªæ€èšŒã«ãŒã«
GreaterThanOrEqualToãšLessThanOrEqualToã¯ãéå§æ¥ãšçµäºæ¥ãªã©ã®ç¯å²ãã£ã«ã¿ãŒã«äœ¿çšããŸããLengthãMaximumLengthãMinimumLengthã¯ãååãã¡ãŒã«ãæ€çŽ¢èªãªã©ã®ããã¹ããã£ã«ã¿ãŒã«äœ¿çšããŸããInclusiveBetweenã¯ããŒãžã³ã°ã«äœ¿çšããpageãšpageSizeãå¶éããŸããNotEmptyã¯è©³çŽ°ç §äŒã§å¿ é ãšãªãèå¥åã«äœ¿çšããŸããMustã¯ãçµäºæ¥ãéå§æ¥ããåã§ããå Žåãªã©ãç¡å¹ãªãã£ã«ã¿ãŒã®çµã¿åããã«äœ¿çšããŸãã
Query Handlers
Query Handler ã¯ããªããžããªãŸãã¯ããŒã¿ããŒã¹ã³ã³ããã¹ããç
§äŒããæé©åããããããžã§ã¯ã·ã§ã³ãè¿ããŸããLino ã§ã¯ãSelect ã«ãããããžã§ã¯ã·ã§ã³ãæç€ºçãªãã£ã«ã¿ãŒãäºæž¬å¯èœãªäžŠã³é ãé©åãªå Žåã® tracking ãªãã®èªã¿åãã䜿ãããšãæšå¥šããŸãã
Query ã® handler 㯠read-only ã§ãªããã°ãªããŸãããç¶æ
ã倿Žãããã¡ã€ã³ã¡ãœãããåŒã³åºãããæ°žç¶çãªå€æŽãçºçããããSaveChanges ãå®è¡ããŸãããèªã¿åããç£æ»èšé²ãçµ±åã®éå§ããŸãã¯ç¶æ
ã®åèšç®ãå¿
èŠãšããå Žåãããã¯éåžžãå¥ã® use case ãŸãã¯åé¢ãããããã»ã¹ã瀺ããŸãã
Query Results
Lino ã§ã¯ãQueries ã®çµæã¯ QueryResult ãµãã£ãã¯ã¹ãæã€ records ã§è¡šãããŸãããã®èŠçŽã¯ãåäžå¿çãåçŽãªãªã¹ããããŒãžã³ã°ããããªã¹ãããŸãã¯ç»é¢ãAPIãçµ±åãbackground process åãã®ç¹å® DTO ã«é©çšãããŸãã
Query results ã¯å®å®ããèªã¿åãå¥çŽã§ããã¹ãã§ãããã¡ã€ã³ãšã³ãã£ãã£ãçŽæ¥å ¬éããè¿éãšããŠã§ã¯ãªããã³ã³ã·ã¥ãŒããŒåãã«èšèšããã DTOs ãšããŠæ±ããŸãã
CLI ã§ Query ãäœæãã
Commands ãšåæ§ã«ãLino ã¯æ¬¡ã®ã³ãã³ããæäŸããŸãã
lino query new
CLI ã¯æ¬¡ã®ãããªãªãã·ã§ã³ãåãä»ããŸãã
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ãŸãã¯--service: 察象ãµãŒãã¹ã-mãŸãã¯--module: 察象ã¢ãžã¥ãŒã«ã-eãŸãã¯--entity: Query ã«é¢é£ä»ãããããšã³ãã£ãã£ã-nã--nameã-qããŸãã¯--query: Query ã®ååã
察話ãããŒäžãLino 㯠Query ãåäžçµæãè¿ãã®ããªã¹ããè¿ãã®ããå°ããŸããçãããªã¹ãã®å ŽåãããŒãžã³ã°ãã¹ããã©ãããå°ããŸããæåŸã«ãè¿ãã¹ãããŸãã¯çæããããããžã§ã¯ã·ã§ã³ã§äœ¿çšãã¹ãããããã£ãéžæã§ããŸãã
Lino ã¯èªåçã«æ¬¡ãçæããŸãã
GetOrderByIdQuery.csGetOrderByIdQueryValidator.csGetOrderByIdQueryHandler.csGetOrderByIdQueryResult.cs
Queries ã®çææ§é ã®äŸ
<ProjectName>/
âââ src/
âââ Services/
âââ <ServiceName>/
âââ Application/
âââ <ProjectName>.<ServiceName>.Application.csproj
âââ UseCases/
âââ Orders/
âââ Commands/
| âââ ...
âââ Queries/
âââ GetOrderById/
âââ GetOrderByIdQuery.cs
âââ GetOrderByIdQueryValidator.cs
âââ GetOrderByIdQueryHandler.cs
âââ GetOrderByIdQueryResult.cs
è»äž¡å¯çšæ§ã®ã«ã¹ã¿ã Query ã§ããæ§é ã¯åããã¿ãŒã³ã«åŸããŸãã
Application/UseCases/Vehicles/Queries/GetVehicleAvailability/ âââ GetVehicleAvailabilityQuery.cs âââ GetVehicleAvailabilityQueryValidator.cs âââ GetVehicleAvailabilityQueryHandler.cs âââ GetVehicleAvailabilityQueryResult.cs
Query ãã¡ã€ã«ã®è²¬å
- Query: èå¥åããã£ã«ã¿ãŒã䞊ã³é ãããŒãžã³ã°ããŸãã¯æ¥ä»ç¯å²ãæã€äžå€ã®ãªã¯ãšã¹ãå¥çŽã
- Validator: èå¥åãããŒãžã³ã°ãå¿ é ãã£ã«ã¿ãŒãæ¥ä»ç¯å²ãæ€çŽ¢æ¡ä»¶ã®æ€èšŒã
- Handler: ã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ãããããžã§ã¯ã·ã§ã³ããã£ã«ã¿ãŒã䞊ã³é ãããŒãžã³ã°ãloggingãtracingãçµæäœæã䜿ã£ãèªã¿åãã®ãªãŒã±ã¹ãã¬ãŒã·ã§ã³ã
- Result: caller åãã«ã¢ããªã³ã°ãããå¿ç DTOãå€ãã®å Žåããªã¹ãé ç®çšã®å éš records ãæã¡ãŸãã
å®è£ ãã§ãã¯ãªã¹ã
lino query newãå®è¡ãããµãŒãã¹ãã¢ãžã¥ãŒã«ããšã³ãã£ãã£ãQuery åãæ»ãå€ã®çš®é¡ãããŒãžã³ã°ã¢ãŒããããããã£ãéžæããŸãã- ãªã¯ãšã¹ãå¥çŽãèŠçŽããcaller ã«æ¬åœã«å¿ èŠãªãã£ã«ã¿ãŒã ããæ®ããŸãã
- ç¹ã«å¿ é èå¥åãæ¥ä»ç¯å²ãpage size ã®å¶éãç¡å¹ãªãã£ã«ã¿ãŒã®çµã¿åããã«ã€ããŠãvalidator ã匷åããŸãã
- handler ã®ãããžã§ã¯ã·ã§ã³ã調æŽããUIãAPIãçµ±åããŸã㯠background process ãèŠæ±ãããã£ãŒã«ãã ããè¿ããŸãã
- Query ã read-only ã«ä¿ã¡ãŸããç¶æ ã倿Žãããã¡ã€ã³ã¡ãœãããåŒã³åºãããhandler ã§å€æŽãä¿åããŸããã
- æ³å®ããã倱æã¯
Resultã§äŒæããé©åãªå Žåã¯æ¢åã®æšæºåããããšã©ãŒã䜿çšããŸãã - API endpointãBlazor ããŒãžãin-process çµ±åãtyped client ãªã©ãQuery ãåŒã³åºãã³ã³ã·ã¥ãŒããŒããã«ãããŠãã¹ãããŸãã
ã«ã¹ã¿ã Query ã®äŸ
SaaS ã®ã¢ãžã¥ãŒã«éçµ±åãããŒã§ã¯ãè»äž¡å¯çšæ§ã®ã«ã¹ã¿ã Query ã lino query new ã§äœæã§ããŸããçæãããæ§é 㯠QueryãHandlerãResultãValidator ãæäŸããŸãããã®åŸãéçºè
ã¯è»äž¡èå¥åãéå§æ¥ãçµäºæ¥ãªã©ã®å¿
èŠãªå
¥åã远å ããç¯å²ãæ£ããããšãæ€èšŒããhandler ã®ããžãã¯ãå®è£
ããŸãããããæåŸ
ãããæµãã§ãããŸãäžè²«ããæ§é ãçæãããã®åŸãæç€ºçãªã³ãŒãã§ãã¡ã€ã³åºæã®æ¯ãèãã宿ãããŸãã
read model ã®æé: Query results ã¯å®å®ããå¥çŽã§ããã¹ãã§ãããã¡ã€ã³ãšã³ãã£ãã£ãçŽæ¥å ¬éããè¿éãšããŠã§ã¯ãªããcaller åãã«èšèšããã DTOs ãšããŠæ±ããŸãã
ãŸãšã
Lino ã§ use cases ãå®çŸ©ããããšã¯ããã¡ã€ã³ã¢ãã«ãæç¢ºãªã¢ããªã±ãŒã·ã§ã³æäœã«å€æããããšã§ããCommands ã¯ç¶æ 倿Žãæ±ããQueries ã¯èªã¿åããæ±ããvalidators ã¯å ¥åå¢çãä¿è·ããhandlers ã¯ãããŒããªãŒã±ã¹ãã¬ãŒã·ã§ã³ããçµæãªããžã§ã¯ãã¯åºåãæšæºåããŸãã
æãéãæµãã¯éåžžããã¡ã€ã³ãã¢ããªã³ã°ããå¿ èŠãª Commands ãš Queries ãçæããçæããããã¡ã€ã«ãèŠçŽããããžãã¹ã®æ¯ãèãã宿ãããå¿ èŠã«å¿ã㊠API ãŸãã¯ããŒãžã§ use case ãå ¬éããbuild ãš tests ã§ãã¹ãŠãæ€èšŒããããšã§ããããã«ãããã¢ãŒããã¯ãã£äžã®å¶åŸ¡ã倱ããã«éçºé床ãä¿ãŠãŸãã
ãããžã§ã¯ããæé·ããã«ã€ããŠãå use case ã 1 ã€ã®ããžãã¹æå³ã«éäžããããµãŒãã¹ãšã¢ãžã¥ãŒã«ã®å¢çãå°éããå¥ã®ã¢ãžã¥ãŒã«ãããã»ã¹ã«åå ããå¿ èŠãããå Žåã¯ã€ãã³ããçµ±åããŸã㯠shadow entities ã䜿çšããŸãã
