使用 Lino 构建完整的 .NET 应用程序:分步指南

ๆœฌไธป้ข˜ๆไพ›ไบ†ไฝฟ็”จ็š„ๅฎž็”จๅˆ†ๆญฅๆŒ‡ๅ— Lino CLI ไฝœไธบๆž„ๅปบ้กน็›ฎ็š„ไธป่ฆๅทฅๅ…ท๏ผšไปŽๅฎ‰่ฃ…ๅ’Œๅˆๅง‹้…็ฝฎ๏ผŒๅˆฐๆœๅŠกใ€ๆจกๅ—ๅ’Œๅฎžไฝ“็š„็”Ÿๆˆ๏ผŒๅ†ๅˆฐไบ‹ไปถใ€Background Jobใ€่ฟ็งปใ€ๆž„ๅปบ Docker ๆ˜ ๅƒๅ’Œ็‰ˆๆœฌๆŽงๅˆถ็ญ‰้ซ˜็บงๅŠŸ่ƒฝใ€‚

็›ฎๆ ‡ๆ˜ฏไปฅ้›†ๆˆ็š„ๆ–นๅผๅฑ•็คบ CLI ๅ‘ฝไปคๅฆ‚ไฝ•้€‚ๅบ”็œŸๅฎž็š„ๅผ€ๅ‘ๆต็จ‹ - ไธไป…ไป…ๆ˜ฏๅˆ—ๅ‡บๅฎƒไปฌ๏ผŒ่€Œๆ˜ฏ่งฃ้‡Šไธบไป€ไนˆๅšๅ‡บๆฏไธช้€‰ๆ‹ฉใ€่‡ชๅŠจ็”Ÿๆˆไป€ไนˆไปฅๅŠๆžถๆž„ๅซไน‰ๆ˜ฏไป€ไนˆใ€‚

ๅฐฝ็ฎกๆฏไธชๅ‘ฝไปคๅทฒ็ปๆœ‰็‰นๅฎš็š„ๆ–‡ๆกฃ๏ผŒไฝ†ๅœจ่ฟ™้‡Œๆ‚จๅฐ†็œ‹ๅˆฐๆต็จ‹ ็ซฏๅˆฐ็ซฏ โ€” ๅฏ้‡ๅค็š„่ทฏ็บฟๅ›พ๏ผŒๅฏไปฅ่Š‚็œๆ•ฐๅฐๆ—ถ็š„้‡ๅคๅทฅไฝœ๏ผŒๅนถๆœ‰ๅŠฉไบŽ็ปดๆŠคไธ€่‡ด็š„ใ€ๅฏๆต‹่ฏ•็š„ไปฃ็ ใ€‚

ๅœจๆ•ดไธชๆŒ‡ๅ—ไธญ๏ผŒๆˆ‘ไปฌๅฐ†่งฃ้‡Š Lino ๅบ”็”จ็š„ๆŠ€ๆœฏๆฆ‚ๅฟต๏ผˆไพ‹ๅฆ‚๏ผš CQRS, ้”ฎๅ…ฅ็ป“ๆžœ, ๆบๅ‘็”Ÿๅ™จ, Outbox ๅ›พๆกˆ๏ผ‰๏ผŒๆˆ‘ไปฌๅฐ†ๅฑ•็คบ็คบไพ‹ๅ‘ฝไปคๅนถๆŒ‡ๅ‡บ็‰ˆๆœฌๆŽงๅˆถใ€้ƒจ็ฝฒๅ’ŒๆŒ็ปญ้›†ๆˆ็š„่‰ฏๅฅฝๅฎž่ทตใ€‚

ไฝฟ็”จๆญค่ทฏ็บฟๅ›พไฝœไธบๅญฆไน ้กบๅบ๏ผš้ฆ–ๅ…ˆไบ†่งฃ็ป“ๆž„๏ผŒ็„ถๅŽๅฏนๅŸŸ่ฟ›่กŒๅปบๆจก๏ผŒ็„ถๅŽ็”Ÿๆˆ APIใ€้กต้ขใ€ไบ‹ไปถๅ’Œ้ƒจ็ฝฒๅทฅไปถใ€‚่ฟ™ๅ‡ๅฐ‘ไบ†่ฟ”ๅทฅๅนถไฝฟ็”Ÿๆˆ็š„ไปฃ็ ไธŽ็ณป็ปŸ่ฎพ่ฎกไฟๆŒไธ€่‡ดใ€‚

ๅฎ‰่ฃ…ๅ’Œ้…็ฝฎ Lino CLI

ๅผ€ๅง‹ไฝฟ็”จ็š„็ฌฌไธ€ๆญฅ Lino CLI ๅฐฑๆ˜ฏๅœจๆ‚จ็š„ๅผ€ๅ‘็Žฏๅขƒไธญๅฎ‰่ฃ…่ฏฅๅทฅๅ…ทใ€‚ ๅฎƒๅˆ†ๅธƒไธบ dotnet ๅ…จๅฑ€ๅทฅๅ…ท๏ผŒ่ฟ™ๆ„ๅ‘ณ็€ๅฎƒๅฐ†ๅฏ็”จไบŽๆ‚จ่ฎก็ฎ—ๆœบไธŠ็š„ไปปไฝ•.NET ้กน็›ฎใ€‚ ๅฎ‰่ฃ…ๅ‰่ฏท็กฎ่ฎคๅฝ“ๅ‰ๆจกๆฟๆ‰€้œ€็š„.NET SDKๅฏ็”จไธ”็ปˆ็ซฏๅฏไปฅ่ฟ่กŒ dotnet ๅนถไธ”.NET ๅ…จๅฑ€ๅทฅๅ…ท็›ฎๅฝ•ไฝไบŽ PATHใ€‚

็ฌฌ1ๆญฅ๏ผšๅฎ‰่ฃ…

่ฆๅฎ‰่ฃ…๏ผˆๆˆ–ๆ›ดๆ–ฐ๏ผ‰Lino CLI๏ผŒ่ฏทๅœจ็ปˆ็ซฏไธญ่ฟ่กŒไปฅไธ‹ๅ‘ฝไปค๏ผš

dotnet tool install --global Tolitech.Lino

้‡่ฆๆ็คบ๏ผš

  • ๅฆ‚ๆžœๅทฒ็ปๅฎ‰่ฃ…ไบ†็‰ˆๆœฌ๏ผŒๅˆ™ๅฏไปฅไฝฟ็”จ dotnet tool update --global Tolitech.Lino ๆ›ดๆ–ฐใ€‚
  • ้ชŒ่ฏ.NET ๅ…จๅฑ€ๅทฅๅ…ท็›ฎๅฝ•ๆ˜ฏๅฆไฝไบŽ PATH ็ณป็ปŸ็š„ๅ‘ฝไปค lino ๅŠŸ่ƒฝๆญฃๅธธใ€‚

็ฌฌ2ๆญฅ๏ผš้…็ฝฎ่ฏญ่จ€

ๅฎ‰่ฃ…ๅŽ๏ผŒๅปบ่ฎฎ้…็ฝฎ CLI ๅฐ†ๅœจๆถˆๆฏใ€ๆ็คบๅ’Œๆ—ฅๅฟ—ไธญไฝฟ็”จ็š„่ฏญ่จ€๏ผˆๆˆ–ๆ–‡ๅŒ–๏ผ‰๏ผš

lino preferences culture set

็ณป็ปŸไผš่ฆๆฑ‚ๆ‚จไปŽๅฏ็”จ่ฏญ่จ€ไธญ่ฟ›่กŒ้€‰ๆ‹ฉใ€‚ๆญค่ฎพ็ฝฎๅฏ็กฎไฟๆ‰€ๆœ‰่ฏดๆ˜Žๅ’Œๆ็คบๅ‡ไปฅๆ‰€้œ€่ฏญ่จ€ไธ€่‡ดๆ˜พ็คบใ€‚ ๆญค้ฆ–้€‰้กนๆ›ดๆ”นไบ† CLI ๆœฌๅœฐๅŒ–ๆถˆๆฏใ€ๆ็คบๅ’ŒๆŒ‡ๅฏผ๏ผ›ๅฎƒไธไผš้‡ๅ‘ฝๅ้กน็›ฎไธญ็”Ÿๆˆ็š„ๅฎžไฝ“ใ€ๆœๅŠกใ€ๆจกๅ—ๆˆ–ไธšๅŠกๆœฏ่ฏญใ€‚

็ฌฌไธ‰ๆญฅ๏ผš่ฎค่ฏไธŽๆณจๅ†Œ

่ฆ่ฎฟ้—ฎๆ‰€ๆœ‰ Lino ๅŠŸ่ƒฝ๏ผŒๅŒ…ๆ‹ฌ้ซ˜็บงๆจกๆฟใ€Docker ๅ›พๅƒๅ‘ๅธƒไปฅๅŠไธŽๅค–้ƒจๆœๅŠก็š„้›†ๆˆ๏ผŒๆ‚จๅฟ…้กป็ป่ฟ‡่บซไปฝ้ชŒ่ฏใ€‚

- ๅฆ‚ๆžœๆ‚จ่ฟ˜ๆฒกๆœ‰ๆณจๅ†Œ๏ผŒ่ฏทไฝฟ็”จไปฅไธ‹ๅ‘ฝไปคๆณจๅ†Œ๏ผš

lino user register

- ๅฆ‚ๆžœๆ‚จๅทฒ็ปๆณจๅ†Œ๏ผŒ่ฏทไฝฟ็”จไปฅไธ‹ๆ–นๅผ็™ปๅฝ•๏ผš

lino auth login

ไผšๅ‘็”Ÿไป€ไนˆ๏ผš CLI ๅœจๆœฌๅœฐๅญ˜ๅ‚จ่บซไปฝ้ชŒ่ฏไปค็‰Œ๏ผŒๅ…่ฎธๆ‚จๆ‰ง่กŒ้œ€่ฆ่ฎฟ้—ฎๅ—ไฟๆŠค่ต„ๆบ็š„ๅ‘ฝไปค๏ผŒ่€Œๆ— ้œ€ๆฏๆฌกไฝฟ็”จๆ—ถ้ƒฝ็™ปๅฝ•ใ€‚ ไฟๆŒๆญคไปค็‰Œ็š„็งๅฏ†ๆ€ง๏ผŒๅนถ้ฟๅ…ๅœจไธๅŒ็š„ๅผ€ๅ‘ไบบๅ‘˜ใ€CI ไปฃ็†ๆˆ–ๆœบๅ™จไน‹้—ดๅ…ฑไบซ็›ธๅŒ็š„็”จๆˆท้…็ฝฎๆ–‡ไปถใ€‚

็ฌฌๅ››ๆญฅ๏ผš้ชŒ่ฏ

่ฆ็กฎ่ฎคๅฎ‰่ฃ…ๅ’Œ่บซไปฝ้ชŒ่ฏๆ˜ฏๅฆๆˆๅŠŸ๏ผŒ่ฏท่ฟ่กŒ๏ผš

lino --version

ๅฆ‚ๆžœ่ฏฅๅ‘ฝไปค่ฟ”ๅ›žๅทฒๅฎ‰่ฃ…็š„็‰ˆๆœฌ๏ผŒๅˆ™ๆ‚จๅฏไปฅๅผ€ๅง‹ไฝฟ็”จ Lino CLI ๅœจๆ‚จ็š„้กน็›ฎไธญใ€‚

ๅˆ›ๅปบ MyApp ้กน็›ฎ

ๅœจๆญคๆญฅ้ชคไธญ๏ผŒๆˆ‘ไปฌๅฐ†ไฝฟ็”จไปฅไธ‹ๅ‘ฝไปคๅˆ›ๅปบ้กน็›ฎ็š„ๅˆๅง‹็ป“ๆž„ Lino CLIใ€‚ ่ฏฅ้กน็›ฎๅฐ†ไฝœไธบๆผ”็คบๆœๅŠกใ€ๆจกๅ—ใ€ๅ‰็ซฏๅ’Œๆ‰€ๆœ‰ไบ‹ไปถ้›†ๆˆ็š„ๅˆ›ๅปบ็š„ๅŸบ็ก€ใ€‚ Lino ้กน็›ฎไธไป…ไป…ๆ˜ฏไธ€ไธชๅŒ…ๅซ่งฃๅ†ณๆ–นๆกˆ็š„ๆ–‡ไปถๅคน๏ผšๅฎƒๅฎšไน‰ไบ†ๆœๅŠก่พน็•Œใ€ๅ…ฑไบซๅบ“ใ€Aspire ไธปๆœบใ€ๅ‰็ซฏๆก†ๆžถใ€ๆต‹่ฏ•ใ€ๅŒ…็ฎก็†ใ€ๅˆ†ๆžๅ™จๅ’Œไธ‹ไธ€ไธชๅ‘ฝไปค้‡็”จ็š„้…็ฝฎ็š„็บฆๅฎšใ€‚

ๆญฅ้ชคไธ€๏ผš่ฟ่กŒๅˆ›ๅปบๅ‘ฝไปค

่ฆๅˆ›ๅปบๆ–ฐ้กน็›ฎ๏ผŒ่ฏทๅœจ็ปˆ็ซฏไธญ่ฟ่กŒไปฅไธ‹ๅ‘ฝไปค๏ผš

lino project new

CLI ๅฐ†้€ๆญฅๆŒ‡ๅฏผๆ‚จ๏ผŒ่ฏข้—ฎไปฅไธ‹ไฟกๆฏ๏ผš

  • ้กน็›ฎๅ็งฐ๏ผš ๆˆ‘ไปฌๅฐ†ไฝฟ็”จ MyApp๏ผŒไฝ†ๆ‚จๅฏไปฅ้€‰ๆ‹ฉไปปไฝ•ๆ‚จๅ–œๆฌข็š„ๅ็งฐ๏ผ›
  • ้™„ๅŠ ๅŠŸ่ƒฝ๏ผš ไปฃ็ ๅˆ†ๆžๅ™จใ€ๅˆ†ๅธƒๅผ็ผ“ๅญ˜ใ€ๅผ‚ๆญฅไบ‹ไปถๆ”ฏๆŒ็ญ‰ใ€‚

็ฌฌ 2 ๆญฅ๏ผš้…็ฝฎๅŸบๆœฌๅŠŸ่ƒฝ

ๅฏนไบŽ่ฟ™ไธช้กน็›ฎ๏ผŒๆˆ‘ไปฌๅปบ่ฎฎไปŽไธ€ๅผ€ๅง‹ๅฐฑๅฏ็”จไปฅไธ‹ๅŠŸ่ƒฝ๏ผš

  • ไปฃ็ ๅˆ†ๆžๅ™จ๏ผš ็กฎไฟไปฃ็ ้ตๅพช่‰ฏๅฅฝๅฎž่ทตๅ’Œไธ€่‡ด็š„ๆ ‡ๅ‡†๏ผŒ้˜ฒๆญขๅธธ่ง็š„ๅฎžๆ–ฝ้”™่ฏฏ๏ผ›
  • ๅˆ†ๅธƒๅผ็ผ“ๅญ˜๏ผš ๆ้ซ˜ๅคšๆœๅŠกๅœบๆ™ฏไธ‹็š„ๅบ”็”จๆ€ง่ƒฝ๏ผŒ้ฟๅ…ไธๅฟ…่ฆ็š„ๆ•ฐๆฎๅบ“ๆŸฅ่ฏข๏ผ›
  • ๅผ‚ๆญฅ้€šไฟก๏ผš ๅ…่ฎธไฝฟ็”จไบ‹ไปถๅ’Œ้˜Ÿๅˆ—่ฟ›่กŒๆœๅŠกไน‹้—ด็š„้›†ๆˆ๏ผŒ็กฎไฟๅฏๆ‰ฉๅฑ•ๆ€งๅ’Œ่งฃ่€ฆใ€‚

ๅœจๆญค้กน็›ฎไธญๅฏ็”จๆ‰€ๆœ‰่ฟ™ไบ›้€‰้กน้žๅธธ้‡่ฆ๏ผŒๅ› ไธบๆˆ‘ไปฌๅฐ†ๅˆ›ๅปบๅคšไธช้€š่ฟ‡้›†ๆˆไบ‹ไปถ่ฟ›่กŒ้€šไฟก็š„ๆœๅŠกใ€‚ ่ฟ™ๅฐ†ไฝฟๆ‚จไบ†่งฃๅฆ‚ไฝ•ไฝฟ็”จ Lino ๆž„ๅปบๆจกๅ—ๅŒ–ๅ’Œๅˆ†ๅธƒๅผ็ณป็ปŸใ€‚

็ฌฌไธ‰ๆญฅ๏ผš็”Ÿๆˆ็ป“ๆž„

ๆ‰ง่กŒๅ‘ฝไปคๅนถ้…็ฝฎ่ต„ๆบๅŽ๏ผŒCLIๅฐ†็”Ÿๆˆๅˆๅง‹้กน็›ฎ็ป“ๆž„ใ€‚ๅฎƒๅฐ†ๅŒ…ๆ‹ฌ๏ผš

  • ๆœๅŠกๅ’Œๆจกๅ—ๆ–‡ไปถๅคน๏ผ›
  • ๅ‰็ซฏๆจกๆฟ๏ผˆๅฆ‚ๆžœ้€‚็”จ๏ผ‰๏ผ›
  • ๅˆๅง‹็ผ“ๅญ˜่ฎพ็ฝฎใ€ไบ‹ไปถๅ’Œ้›†ๆˆ๏ผ›
  • ๅ‡†ๅค‡็ผ–่ฏ‘็š„่งฃๅ†ณๆ–นๆกˆ (.slnx) ๅ’Œ้กน็›ฎ (.csproj) ๆ–‡ไปถใ€‚

็Žฐๅœจไฝ ็š„้กน็›ฎ ๆˆ‘็š„ๅบ”็”จ็จ‹ๅบ ๅทฒๅ‡†ๅค‡ๅฅฝๆŽฅๆ”ถๆˆ‘ไปฌๅฐ†ๅœจไธ‹ไธ€ๆญฅไธญ้…็ฝฎ็š„ๆœๅŠกใ€ๆจกๅ—ใ€ๅฎžไฝ“ๅ’Œๅ‰็ซฏใ€‚ ๅœจ็ปง็ปญไน‹ๅ‰๏ผŒๆ‰“ๅผ€็”Ÿๆˆ็š„่งฃๅ†ณๆ–นๆกˆๅนถ่ฟ่กŒ dotnet build ็กฎ่ฎคๅผ•็”จใ€ๆบ็”Ÿๆˆๅ™จใ€ๆจกๆฟใ€้กน็›ฎๆ–‡ไปถๅ’Œๅˆๅง‹้…็ฝฎๆ˜ฏไธ€่‡ด็š„ใ€‚

ๆทปๅŠ  Backoffice Web ๅบ”็”จ็จ‹ๅบ

ไธ€ไธชๅฎŒๆ•ด็š„็ณป็ปŸ้€šๅธธ้œ€่ฆ่‡ณๅฐ‘ไธ€ไธช Web ๅบ”็”จ็จ‹ๅบๆฅๆ“ไฝœๅŸŸใ€‚ๅœจๆœฌๆŒ‡ๅ—ไธญ๏ผŒ่ฏฅๅบ”็”จ็จ‹ๅบ็งฐไธบ Backoffice ไปฃ่กจ็ฎก็†ๅ‘˜ใ€็ป็†ๆˆ–ๆ“ไฝœ็”จๆˆท็›‘ๆŽงไบงๅ“ใ€็ฑปๅˆซใ€ๅบ“ๅญ˜ใ€้”€ๅ”ฎๅ’Œๅ…ถไป–็ณป็ปŸไฟกๆฏ็š„ๅ†…้ƒจ็•Œ้ขใ€‚

Web ๅบ”็”จ็จ‹ๅบไธไผšๅ–ไปฃๅŸŸๆœๅŠกใ€‚ๅฎƒๅ……ๅฝ“่ง†่ง‰ๅ…ฅๅฃ็‚นๆฅไฝฟ็”จ APIใ€่งฆๅ‘ๅ‘ฝไปคใ€ๆŸฅ้˜…ๆŸฅ่ฏขๅนถๆ˜พ็คบไธŽๆœๅŠกไธญๅทฒๅปบๆจก็š„่ง„ๅˆ™ไธ€่‡ด็š„ๅฑๅน•ใ€‚

ๆญฅ้ชคไธ€๏ผš่ฟ่กŒๅˆ›ๅปบๅ‘ฝไปค

่ฆๅ‘้กน็›ฎๆทปๅŠ ๆ–ฐ็š„ Web ๅบ”็”จ็จ‹ๅบ๏ผŒ่ฏทไฝฟ็”จ๏ผš

lino web-app new

ไธบไบ†ไพฟไบŽ่พ“ๅ…ฅ๏ผŒไนŸๅฏไปฅไฝฟ็”จๅˆซๅ lino webapp newใ€‚ๆ‰ง่กŒ่ฟ‡็จ‹ไธญ๏ผŒ่ฏทไธบ Web ๅบ”็”จ็จ‹ๅบๆไพ›ๆธ…ๆ™ฐ็š„ๅ็งฐ๏ผ›ๅœจๆœฌ็คบไพ‹ไธญ๏ผŒๆˆ‘ไปฌๅฐ†ไฝฟ็”จ Backofficeใ€‚

lino web-app new --name Backoffice

็ฌฌ 2 ๆญฅ๏ผšไบ†่งฃ็”Ÿๆˆ็š„็ป“ๆž„

ๆต็จ‹็ป“ๆŸๅŽ๏ผŒLino ไผšๅœจ src/WebApps/<WebAppName> ไธญๅˆ›ๅปบ Web App ็š„ๅˆๅง‹็ป“ๆž„ใ€‚ๅฏนไบŽ Blazor ๅบ”็”จ็จ‹ๅบ๏ผŒ่ฏฅ็ป“ๆž„ๅฏ่ƒฝๅŒ…ๆ‹ฌ server/client ้กน็›ฎใ€ๅ…ฑไบซ่ต„ๆบใ€ๆœฌๅœฐๅŒ–ๆ–‡ไปถใ€็”จไบŽๆถˆ่ดน APIs ็š„ clients๏ผŒไปฅๅŠ็จๅŽ็”ฑ lino page new ไฝฟ็”จ็š„็บฆๅฎšใ€‚

  • ้กต้ขใ€็ป„ไปถใ€ๅธƒๅฑ€ใ€ๆœๅŠกๅ’Œๅบ”็”จ็จ‹ๅบ่ต„ๆบ็š„ๆ–‡ไปถๅคน๏ผ›
  • ๆถˆ่ดน้กน็›ฎๆœๅŠกๆšด้œฒ็š„ API ๆ‰€้œ€็š„ HTTP ๅฎขๆˆท็ซฏๅ’Œๅˆ็บฆ๏ผ›
  • ็ฝ‘็ปœไฝ“้ชŒไฝฟ็”จ็š„ๆœฌๅœฐๅŒ–่ต„ๆบๅ’Œๅˆๅง‹ๆจกๆฟ๏ผ›
  • ๅฝ“ๅบ”็”จ็จ‹ๅบ็ฑปๅž‹้œ€่ฆ่ฟ™็งๅˆ†็ฆปๆ—ถ๏ผŒๅฎขๆˆท็ซฏ/ๆœๅŠกๅ™จ้กน็›ฎ๏ผ›
  • ๅฐ†ๅœจ้กต้ข็”Ÿๆˆไธญ้‡็”จ็š„่ทฏ็บฟใ€ๅฏผ่ˆชๅ’Œ้›†ๆˆ็บฆๅฎš๏ผ›
  • ๅฝ“ๅฐ†่บซไปฝ้ชŒ่ฏๅŠŸ่ƒฝๆทปๅŠ ๅˆฐ้กน็›ฎไธญๆ—ถ๏ผŒไธŽ่บซไปฝ้ชŒ่ฏๅ’ŒๆŽˆๆƒ็š„้›†ๆˆ็‚นใ€‚

ๆญฅ้ชค 3๏ผšไฝ•ๆ—ถๅœจๆต็จ‹ไธญๅˆ›ๅปบ Web ๅบ”็”จ็จ‹ๅบ

ๅฆ‚ๆžœไฝ ๅทฒ็ป็Ÿฅ้“็ณป็ปŸไผšๆœ‰ Blazor ็•Œ้ข๏ผŒ่ฏทๅœจๅˆ›ๅปบ้กน็›ฎไน‹ๅŽๅฐฝๆ—ฉๅˆ›ๅปบ Web Appใ€‚่ฟ™ๆ ทๅŽ็ปญ็”Ÿๆˆ็š„ servicesใ€modulesใ€entitiesใ€APIs ๅ’Œ pages ๅฐฑไผšไธŽๆถˆ่ดนๅฎƒไปฌ็š„ Web ๅบ”็”จ็จ‹ๅบไฟๆŒไธ€่‡ดใ€‚

่ฟ™ไธชๆต็จ‹็‰นๅˆซๆœ‰็”จ๏ผŒๅ› ไธบๅŽ็ปญๅˆ›ๅปบ็š„ services ไนŸไผš็”Ÿๆˆ็”ฑ Blazor ้กน็›ฎๆถˆ่ดน็š„ๅผบ็ฑปๅž‹ Api.Contracts ๅ’Œ Api.Client ้กน็›ฎใ€‚ไปŽไธ€ๅผ€ๅง‹ๅฐฑๆœ‰ Web App๏ผŒๅฏไปฅๆ›ดๅฎนๆ˜“้ชŒ่ฏๅฎŒๆ•ด่ทฏๅพ„๏ผšdomainใ€APIใ€contractsใ€HttpClient ๅ’Œ้กต้ขใ€‚

้‡่ฆๆ็คบ

  • ๅŽๅฐๅฟ…้กป้€š่ฟ‡็”Ÿๆˆ็š„APIๆฅๆถˆ่ดนๆ•ฐๆฎ๏ผŒๅœจๆญฃ็กฎ็š„ๆœๅŠกๅ’Œๆจกๅ—ไธญ็ปดๆŠคไธšๅŠก้€ป่พ‘ใ€‚
  • ๅœจๅ…ฌๅผ€็ฎก็†้กต้ขไน‹ๅ‰๏ผŒ่ฏทๆฃ€ๆŸฅ่บซไปฝ้ชŒ่ฏใ€ๆŽˆๆƒใ€่ง’่‰ฒใ€ๆƒ้™ๅ’Œ่ฎฟ้—ฎ็ญ–็•ฅใ€‚
  • ๆ‚จๅฏไปฅๅˆ›ๅปบๅคšไธช Web ๅบ”็”จ็จ‹ๅบ๏ผŒไพ‹ๅฆ‚ Backoffice ๅ†…้ƒจๅ’Œไธ€ไธช Site ๅฝ“ๅ—ไผ—ใ€ๆƒ้™ใ€้ƒจ็ฝฒๆˆ–่Œ่ดฃไธๅŒๆ—ถ๏ผŒๅ…ฌๅผ€ใ€‚
  • ้ฟๅ…ๅœจๅŒไธ€ไธช Web ๅบ”็”จ็จ‹ๅบไธญๆททๅˆๅ…ฌๅ…ฑๅ’Œ็ฎก็†ๆต็จ‹๏ผŒๅ› ไธบ่ฟ™ไผšๅฏผ่‡ดๅฎ‰ๅ…จใ€ๅฏผ่ˆชใ€้ƒจ็ฝฒๆˆ–ๅ›ข้˜Ÿๆ‰€ๆœ‰ๆƒๅ˜ๅพ—ๅ›ฐ้šพใ€‚

ๅˆ›ๅปบ Web ๅบ”็”จ็จ‹ๅบๅŽ๏ผŒๆŒ‡ๅ—ๅฏไปฅ็ปง็ปญ่ฎจ่ฎบๅฐ†ๆไพ›ๆญค็•Œ้ขๆ‰€ไฝฟ็”จ็š„ๆ•ฐๆฎๅ’ŒไธšๅŠก่ง„ๅˆ™็š„ๆœๅŠกๅ’Œๆจกๅ—ใ€‚

ๅˆ›ๅปบๆœๅŠกๅ’Œๆจกๅ—

ๅœจๆญคๆญฅ้ชคไธญ๏ผŒๆˆ‘ไปฌๅฐ†ๆž„ๅปบๆž„ๆˆๅบ”็”จ็จ‹ๅบ็š„ๆœๅŠกๅ’Œๆจกๅ—ใ€‚ ็›ฎๆ ‡ๆ˜ฏๅˆ›ๅปบไธ€ไธชๆจกๅ—ๅŒ–ๅ’Œๅฏๆ‰ฉๅฑ•็š„ๆžถๆž„๏ผŒๅ…่ฎธ็ณป็ปŸ็š„ไธๅŒ้ข†ๅŸŸ๏ผˆไพ‹ๅฆ‚ไบงๅ“ใ€็ฑปๅˆซใ€ๅบ“ๅญ˜ใ€้”€ๅ”ฎๅ’Œๅช’ไฝ“๏ผ‰็‹ฌ็ซ‹ๅ‘ๅฑ•๏ผŒไฟๆŒๅ‡่šๅŠ›ๅนถๆ–นไพฟ็ปดๆŠคใ€‚ ๆœๅŠกๅฎšไน‰้ƒจ็ฝฒๅ’ŒๆŒไน…ๅŒ–่พน็•Œ๏ผ›ๆจกๅ—ๅœจๆจกๅ—ๅŒ–ๆœๅŠกไธญ็ป„็ป‡ไธšๅŠก้ข†ๅŸŸใ€‚ๅœจๅˆ›ๅปบๆ–‡ไปถไน‹ๅ‰๏ผŒ่ฏ„ไผฐๅŸŸ็š„ๅ“ชไบ›้ƒจๅˆ†้œ€่ฆ่‡ชๅทฑ็š„ๆ•ฐๆฎๅบ“ใ€็‹ฌ็ซ‹็‰ˆๆœฌใ€้›†ๆˆๅ่ฎฎๆˆ–ๅ•็‹ฌ็š„ๆ‰€ๆœ‰ๆƒใ€‚

็ฌฌ 1 ๆญฅ๏ผšๅฎšไน‰ๆœๅŠก

ๆœ€ๅˆ๏ผŒๆˆ‘ไปฌๅฐ†ๅˆ›ๅปบไปฅไธ‹ๆœๅŠก๏ผŒๆฏไธชๆœๅŠก้ƒฝๆœ‰ๆ˜Ž็กฎๅฎšไน‰็š„่Œ่ดฃ๏ผš

  • Catalog ๏ผˆๆจกๅ—ๅŒ–๏ผ‰โ€”โ€”่ดŸ่ดฃ็ฎก็†ไบงๅ“ใ€็ฑปๅˆซๅ’Œไปทๆ ผ๏ผ›
  • Sales โ€“ ่ดŸ่ดฃๅค„็†้”€ๅ”ฎๅ’Œ่ฎขๅ•๏ผ›
  • Stock โ€“ ่ดŸ่ดฃ็ฎก็†ๅบ“ๅญ˜ๅ’Œๅ˜ๅŠจ๏ผ›
  • Security โ€“ ่ดŸ่ดฃ่ฎค่ฏใ€ๆŽˆๆƒๅ’Œ็”จๆˆท็ฎก็†ใ€‚

่ฆๅˆ›ๅปบ็คบไพ‹ไธญ็š„ services๏ผŒ่ฏทไธบๆฏไธช service ๆ‰ง่กŒไธ€ไธชๅ‘ฝไปคใ€‚ๅœจ Catalog wizard ไธญ้€‰ๆ‹ฉ modular architecture๏ผ›ๅฏนไบŽๅ…ถไป–ๆœๅŠก๏ผŒ้€‰ๆ‹ฉ้€‚ๅˆ็ฎ€ๅ•่พน็•Œ็š„ architectureใ€‚

lino service new --name Catalog
lino service new --name Sales
lino service new --name Stock
lino service new --name Security

ๅ‘ฝไปคๆ‰ง่กŒๆœŸ้—ด๏ผŒCLI ไผš่ฆๆฑ‚ๆไพ›๏ผš

  • Service name: ไพ‹ๅฆ‚ Catalog๏ผ›
  • Display name and architectural style: ๅฏนไบŽ็ดงๅ‡‘่พน็•Œ้€‰ๆ‹ฉ simple architecture๏ผ›ๅฝ“ service ๆœ‰็‹ฌ็ซ‹ไธ”ๅ†…่š็š„ๅŒบๅŸŸๆ—ถ้€‰ๆ‹ฉ modular๏ผ›
  • Database: ้€‰ๆ‹ฉๆœ€้€‚ๅˆ้กน็›ฎ็š„ๆŠ€ๆœฏ๏ผˆSQL Serverใ€PostgreSQL ็ญ‰๏ผ‰๏ผ›

ๆญฅ้ชค 2๏ผšๅœจ services ๅ†…ๅˆ›ๅปบ modules

ๅนถ้žๆ‰€ๆœ‰ services ้ƒฝ้œ€่ฆ modularใ€‚ๅœจๆˆ‘ไปฌ็š„ project ไธญ๏ผŒๅชๆœ‰ Catalog service ไผšๆœ‰ modules๏ผŒ็”จไบŽๅˆ†็ฆป merchandising ๅ’Œ pricing ็ญ‰่Œ่ดฃใ€‚

ๆˆ‘ไปฌไธบ Catalog service ๅฎšไน‰ไปฅไธ‹ modules๏ผš

  • Merchandising โ€“ products ๅ’Œ categories ็ฎก็†๏ผ›
  • Pricing โ€“ pricesใ€promotions ๅ’Œๅ˜ๆ›ดๅކๅฒ็ฎก็†ใ€‚

่ฆๅˆ›ๅปบ Catalog ็š„ modules๏ผŒ่ฏทๆ‰ง่กŒ๏ผš

lino module new --service Catalog --name Merchandising
lino module new --service Catalog --name Pricing

ๆ‚จๅฏไปฅๅœจๆจกๅ—ๅŒ–ๆœๅŠกไธญๅˆ›ๅปบไปปๆ„ๆ•ฐ้‡็š„ๆจกๅ— Catalogใ€‚ ๆญคๅค–๏ผŒๆ นๆฎๅคๆ‚็จ‹ๅบฆ๏ผŒๆŸไบ›ๆจกๅ—ๅฐ†ๆฅๅฏ่ƒฝไผšๆˆไธบ็‹ฌ็ซ‹็š„ๆœๅŠกใ€‚ ่ฟ™้‡Œๆๅ‡บ็š„ๅˆ†็ฆปไป…็”จไบŽๆ•™ๅญฆ็›ฎ็š„๏ผŒๅนถไฝœไธบๆจกๅ—ๅŒ–็ป„็ป‡็š„็คบไพ‹ใ€‚ ไธ่ฆๅชไฝฟ็”จๆจกๅ—ๆฅๅˆ›ๅปบๆ–‡ไปถๅคน๏ผ›ๅฝ“ๅฎƒไปฌไฟๆŠคๅ…ทๆœ‰่‡ชๅทฑ็š„ๅฎžไฝ“ใ€็”จไพ‹ใ€APIใ€่ฟ็งปๅ’Œไบ‹ไปถ็š„ไธšๅŠก้ข†ๅŸŸๆ—ถ๏ผŒ่ฏทไฝฟ็”จๅฎƒไปฌใ€‚

ๆœ€็ปˆ้กน็›ฎ็ป“ๆž„

ๅˆ›ๅปบๆœๅŠกๅ’Œๆจกๅ—ๅŽ๏ผŒๆ‚จ็š„่งฃๅ†ณๆ–นๆกˆๅบ”ๅ…ทๆœ‰็ฑปไผผไบŽไปฅไธ‹็š„็ป“ๆž„๏ผš

MyApp/
โ””โ”€โ”€ src/
    โ”œโ”€โ”€ Aspire/
    โ”œโ”€โ”€ Integrations/
    โ”œโ”€โ”€ Services/
    โ”‚   โ”œโ”€โ”€ Catalog/
    โ”‚   โ”‚   โ”œโ”€โ”€ Modules/
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Merchandising/
    โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Pricing/
    โ”‚   โ”‚   โ”œโ”€โ”€ MyApp.Catalog.Host
    โ”‚   โ”‚   โ””โ”€โ”€ MyApp.Catalog.Infrastructure
    โ”‚   โ”œโ”€โ”€ Sales/
    โ”‚   โ”œโ”€โ”€ Security/
    โ”‚   โ”œโ”€โ”€ Shared/
    โ”‚   โ””โ”€โ”€ Stock/
    โ””โ”€โ”€ WebApps/
        โ”œโ”€โ”€ Backoffice/
        โ”‚   โ”œโ”€โ”€ Services/
        โ”‚   โ”‚   โ”œโ”€โ”€ Catalog/
        โ”‚   โ”‚   โ”œโ”€โ”€ Sales/
        โ”‚   โ”‚   โ”œโ”€โ”€ Security/
        โ”‚   โ”‚   โ””โ”€โ”€ Stock/
        โ”‚   โ”œโ”€โ”€ MyApp.WebApp.Backoffice
        โ”‚   โ””โ”€โ”€ MyApp.WebApp.Backoffice.Client
        โ””โ”€โ”€ Shared/
            โ””โ”€โ”€ MyApp.WebApp.Shared
โ””โ”€โ”€ tests/
    โ””โ”€โ”€ Services/
        โ”œโ”€โ”€ Catalog/
        โ”‚   โ”œโ”€โ”€ Merchandising/
        โ”‚   โ””โ”€โ”€ Pricing/
        โ”œโ”€โ”€ Sales/
        โ”œโ”€โ”€ Security/
        โ”œโ”€โ”€ Shared/
        โ””โ”€โ”€ Stock/

็ป“ๆž„่ฏดๆ˜Ž๏ผš

  • Services/๏ผšๅŒ…ๅซๆ‰€ๆœ‰็ณป็ปŸๆœๅŠก๏ผŒๆฏไธชๆœๅŠก้ƒฝๆœ‰่‡ชๅทฑ็š„ไธšๅŠก้€ป่พ‘ใ€ๅŸบ็ก€่ฎพๆ–ฝๅ’Œๆ‰˜็ฎก๏ผ›
  • Modules/๏ผšๆจกๅ—ๅŒ–ๆœๅŠกไธญ็š„ๆ–‡ไปถๅคน๏ผŒๅ…่ฎธๆ‚จ็ป„็ป‡็‰นๅฎšๅŠŸ่ƒฝๅนถไฟๆŒไธ€่‡ด็š„ไปฃ็ ๏ผ›
  • WebApps/๏ผšไธŽ็ณป็ปŸ็›ธๅ…ณ็š„ๅ‰็ซฏ๏ผŒๅทฒ็ปไธŽๆœๅŠก้›†ๆˆ๏ผ›
  • Shared/๏ผšๆœๅŠกๅ’Œๅ‰็ซฏไน‹้—ดๅ…ฑไบซ็š„ๅบ“ๅ’Œ่ต„ๆบ๏ผ›
  • tests/๏ผšๆŒ‰ๆœๅŠกๅ’Œๆจกๅ—็ป„็ป‡็š„ๅ•ๅ…ƒๅ’Œ้›†ๆˆๆต‹่ฏ•ใ€‚

้€š่ฟ‡่ฟ™็งๆจกๅ—ๅŒ–็ป“ๆž„๏ผŒๆฏไธชๅ›ข้˜Ÿๆˆ–ๅผ€ๅ‘ไบบๅ‘˜้ƒฝๅฏไปฅๅœจ็ณป็ปŸ็š„ไธๅŒ้ƒจๅˆ†็‹ฌ็ซ‹ๅทฅไฝœ๏ผŒไปŽ่€Œไฟƒ่ฟ›ๅฏๆ‰ฉๅฑ•ๆ€งใ€็ปดๆŠคๅ’Œๆต‹่ฏ•ใ€‚ ๅˆ›ๅปบๆœๅŠกๅ’Œๆจกๅ—ๅŽ๏ผŒ่ฟ่กŒ dotnet build ็กฎ่ฎค้กน็›ฎๅทฒๆญฃ็กฎ้™„ๅŠ ๅˆฐ่งฃๅ†ณๆ–นๆกˆใ€ๆ‰˜็ฎก Aspireใ€ๅ…ฑไบซ้กน็›ฎๅ’Œๆต‹่ฏ•ๆก†ๆžถใ€‚

ๆทปๅŠ ่ฎค่ฏๅ’ŒๆŽˆๆƒ

่บซไปฝ้ชŒ่ฏๅ’ŒๆŽˆๆƒๆ˜ฏไปปไฝ•็Žฐไปฃ็ณป็ปŸ็š„ๅŸบๆœฌ่ฆ็ด ใ€‚ ่บซไปฝ้ชŒ่ฏ่ฏๆ˜Ž็”จๆˆทๆ˜ฏ่ฐ๏ผ›ๆŽˆๆƒๅฎšไน‰ไบ†่ฏฅ็”จๆˆทๅฏไปฅๆ‰ง่กŒ็š„ๆ“ไฝœใ€‚ๅœจ Lino CLI ไธญ๏ผŒ่บซไปฝ้ชŒ่ฏๅŠŸ่ƒฝไธบ็”จๆˆทใ€่ง’่‰ฒใ€ๆƒ้™ใ€ไปค็‰Œใ€่ฎฟ้—ฎ็ญ–็•ฅไปฅๅŠไธŽ API ็š„้›†ๆˆ็”Ÿๆˆๅฟ…่ฆ็š„ๅŸบ็ก€ใ€‚

ๆญฅ้ชคไธ€๏ผš่ฟ่กŒ่ฎค่ฏๅ‘ฝไปค

่ฆๆทปๅŠ ่บซไปฝ้ชŒ่ฏๅ’ŒๆŽˆๆƒๅŠŸ่ƒฝ๏ผŒ่ฏทไฝฟ็”จไปฅไธ‹ๅ‘ฝไปค๏ผš

lino feature auth add

CLI ๅฐ†ๆŒ‡ๅฏผๆ‚จๅฎŒๆˆไปฅไธ‹ๆญฅ้ชค๏ผš

  • ๆœๅŠกๆˆ–ๆจกๅ—็š„้€‰ๆ‹ฉ๏ผš ๆ‚จ้œ€่ฆๆŒ‡็คบ่บซไปฝ้ชŒ่ฏๅทฅไปถ็š„ๅฎ‰่ฃ…ไฝ็ฝฎใ€‚ ๅœจๆˆ‘ไปฌ็š„็คบไพ‹้กน็›ฎไธญ๏ผŒๆˆ‘ไปฌไฝฟ็”จ่ฏฅๆœๅŠก Security๏ผŒ้›†ไธญไบ†็ณป็ปŸ็š„ๆ‰€ๆœ‰ๅฎ‰ๅ…จ้€ป่พ‘๏ผ›
  • ้™„ๅŠ ่ฎพ็ฝฎ๏ผš ๅˆ›ๅปบ็”จๆˆทใ€่ง’่‰ฒใ€ๆƒ้™ใ€ไปค็‰Œ่กจๅ’Œ่ฎฟ้—ฎ็ญ–็•ฅ้…็ฝฎ๏ผ›
  • ไปค็‰Œ็”Ÿๅ‘ฝๅ‘จๆœŸ๏ผš ๆ นๆฎไบงๅ“็š„ๅฎ‰ๅ…จ็ญ–็•ฅๅฎšไน‰่ฎฟ้—ฎไปค็‰Œๅ’Œๅˆทๆ–ฐไปค็‰Œ็š„่ฟ‡ๆœŸๆ—ถ้—ด๏ผ›
  • ็”จๆˆทๆ ‡่ฏ†็ฌฆ็ฑปๅž‹๏ผš ้€‰ๆ‹ฉ็”จๆˆทๆจกๅž‹ๅ’Œ็”Ÿๆˆ็š„ๅˆ็บฆไฝฟ็”จ็š„็ฑปๅž‹ใ€‚

็ฌฌ2ๆญฅ๏ผš็”Ÿๆˆ็ป“ๆž„

ๆ‰ง่กŒๅ‘ฝไปคๅŽ๏ผŒๆœๅŠก Security ๅฐ†ๅŒ…ๅซๆ–‡ไปถๅ’Œๆ–‡ไปถๅคน๏ผŒไพ‹ๅฆ‚๏ผš

  • ๅŸŸ/ๅฎžไฝ“๏ผš ็”จๆˆทใ€่ง’่‰ฒใ€ๆƒ้™ๅ’Œไปค็‰Œ็š„่šๅˆใ€ๅฎžไฝ“ๅ’Œ่ง„ๅˆ™๏ผ›
  • ๅŸบ็ก€่ฎพๆ–ฝ/ๆŒไน…ๆ€ง๏ผš ๆ•ฐๆฎๅบ“้…็ฝฎใ€Entity Framework ๅฎ‰ๅ…จ่กจๆ˜ ๅฐ„ๅ’Œ่ฟ็งป๏ผ›
  • ๅบ”็”จ๏ผš ๅ‘ฝไปคใ€ๆŸฅ่ฏขใ€ๅค„็†็จ‹ๅบใ€่บซไปฝ้ชŒ่ฏๆœๅŠกใ€ไปค็‰Œ็”Ÿๆˆใ€ๅ‡ญ่ฏ้ชŒ่ฏๅ’Œๆƒ้™ๆฃ€ๆŸฅ๏ผ›
  • API/ไธปๆœบ๏ผš ็™ปๅฝ•ใ€ๆณจ้”€ใ€ๆณจๅ†Œใ€ๅˆทๆ–ฐไปค็‰Œๅ’Œๅ—ไฟๆŠคๆ“ไฝœ็š„็ซฏ็‚น๏ผ›
  • ไธŽ็ฝ‘็ปœๅบ”็”จ็จ‹ๅบ้›†ๆˆ๏ผš ๅฝ“ๅญ˜ๅœจ Web ๅบ”็”จ็จ‹ๅบๆ—ถๆ”ฏๆŒ็ป่ฟ‡่บซไปฝ้ชŒ่ฏ็š„ๆตใ€‚

่ฟ™ๆ ท๏ผŒๆ‚จ็š„ๅบ”็”จ็จ‹ๅบๅฐ†ๅ…ทๆœ‰ๅผบๅคง็š„่บซไปฝ้ชŒ่ฏๅ’Œ็ฒพ็ป†็š„่ฎฟ้—ฎๆŽงๅˆถ๏ผŒๅฏไปฅๆ”ฏๆŒๅคšไธช็”จๆˆทๅ’ŒไธๅŒ็บงๅˆซ็š„ๆƒ้™ใ€‚ ๅฐฝ็ฎกๅฆ‚ๆญค๏ผŒ็”Ÿๆˆ็š„ไปฃ็ ๅบ”่ฏฅ่ขซ่ง†ไธบๅšๅฎž็š„ๅŸบ็ก€๏ผŒ่€Œไธๆ˜ฏๆœ€็ปˆ็š„ๅฎ‰ๅ…จๅฎกๆŸฅใ€‚ๅœจ็”Ÿไบงไน‹ๅ‰๏ผŒๆฃ€ๆŸฅไปค็‰Œ็”Ÿๅ‘ฝๅ‘จๆœŸใ€ๆƒ้™่ฎพ่ฎกใ€ๅฏ†็ ็ญ–็•ฅใ€HTTPSใ€ๆœบๅฏ†ใ€้€Ÿ็އ้™ๅˆถใ€ๆ—ฅๅฟ—ๅ’Œ้ƒจ็ฝฒ้…็ฝฎใ€‚

ๆทปๅŠ Background Job

ๅœจๅˆ†ๅธƒๅผๅ’Œๆจกๅ—ๅŒ–็ณป็ปŸไธญ๏ผŒๅฐฑๅƒๆˆ‘ไปฌๆญฃๅœจๆž„ๅปบ็š„็ณป็ปŸไธ€ๆ ท Lino CLI๏ผŒๅนถ้žๆ‰€ๆœ‰ๆœๅŠก้ƒฝ็›ดๆŽฅ็›ธไบ’้€šไฟกใ€‚ ไธบไบ†็กฎไฟไฟกๆฏไบคๆข็š„ไธ€่‡ดๆ€งๅ’Œๅฏ้ ๆ€ง๏ผŒๆˆ‘ไปฌไฝฟ็”จ้›†ๆˆไบ‹ไปถใ€‚ ็„ถ่€Œ๏ผŒไธบไบ†้ซ˜ๆ•ˆใ€ๅผ‚ๆญฅๅœฐๅค„็†่ฟ™ไบ›ไบ‹ไปถ๏ผŒๆˆ‘ไปฌ้œ€่ฆ Background Jobsใ€‚

Lino้‡‡็”จๆ ‡ๅ‡† Outbox ๅ›พๆกˆ ็กฎไฟๆœๅŠก็”Ÿๆˆ็š„ๆ‰€ๆœ‰ๆถˆๆฏๅœจๅ‘้€ไน‹ๅ‰้ƒฝๅพ—ๅˆฐๅฏ้ ่ฎฐๅฝ•ใ€‚ ๅ€Ÿๆญค๏ผŒๆˆ‘ไปฌๅฎž็Žฐไบ†๏ผš

  • ้ฟๅ…ๆœๅŠกๆ•…้šœๆˆ–้‡ๅฏๆ—ถไบ‹ไปถไธขๅคฑ๏ผ›
  • ็กฎไฟๅŒไธ€ๆกๆถˆๆฏๅชๅ‘้€ไธ€ๆฌก๏ผ›
  • ๅ…่ฎธๅœจๅ‘้€ๅคฑ่ดฅ็š„ๆƒ…ๅ†ตไธ‹้‡ๆ–ฐๅค„็†ๆถˆๆฏ๏ผ›
  • ๅฐ†ไบ‹ไปถๅค„็†ไธŽไธปๅบ”็”จ็จ‹ๅบ้€ป่พ‘ๅˆ†ๅผ€๏ผŒไปŽ่€Œๆ้ซ˜ๆ€ง่ƒฝๅ’Œๅฏๆ‰ฉๅฑ•ๆ€งใ€‚

็ฌฌ1ๆญฅ๏ผšๆ‰ง่กŒๅ‘ฝไปค

่ฆๅฐ†Background Jobๆ”ฏๆŒๆทปๅŠ ๅˆฐๆ‚จ็š„้กน็›ฎ๏ผŒ่ฏท่ฟ่กŒไปฅไธ‹ๅ‘ฝไปค๏ผš

lino feature background-job add

CLI ไผš่ฆๆฑ‚ๆ‚จ้€‰ๆ‹ฉ่ฆๅฎ‰่ฃ…Background Job็š„ๆœๅŠกใ€‚ไธ€่ˆฌๆฅ่ฏด๏ผŒๆ‚จไผš้€‰ๆ‹ฉ้›†ไธญไบ‹ไปถๅˆถไฝœ็š„ๆœๅŠก๏ผŒไพ‹ๅฆ‚ Catalog ๆˆ–่€… Salesใ€‚ ๅœจๅฝ“ๅ‰้€‰้กนไธญ๏ผŒๅ‘ๅฏผ่ฟ˜ๅฏไปฅ่ฏทๆฑ‚ๆจกๅ—ใ€ไฝœไธšๅบ“ใ€ๆ˜ฏๅฆๅบ”ๅค„็† Outbox ไบ‹ไปถใ€่ฎกๅˆ’ๅ’Œๆ‰น้‡ๅคงๅฐใ€‚ๅฝ“ๅ‰ๆจกๆฟๆต็จ‹ไฝฟ็”จ Hangfire ่ฟ›่กŒ้‡ๅคไฝœไธšๆ‰ง่กŒใ€‚

็ฌฌ2ๆญฅ๏ผš้…็ฝฎๆ‰ง่กŒ

ๅœจ้…็ฝฎ่ฟ‡็จ‹ไธญ๏ผŒๆ‚จๅฐ†่ƒฝๅคŸๅฎšไน‰๏ผš

  • ๆฃ€ๆŸฅ้—ด้š”๏ผš ็กฎๅฎšBackground Jobๆฃ€ๆŸฅ่กจ็š„้ข‘็އ Outbox ๅฏนไบŽๆ–ฐๆถˆๆฏใ€‚้—ด้š”ๅคช็ŸญไผšๅขžๅŠ ่ต„ๆบๅ ็”จ๏ผŒ้—ด้š”ๅคช้•ฟไผšๅปถ่ฟŸไบ‹ไปถไผ ้€’๏ผ›
  • ไธ€ๆฌกๅค„็†ไธ€ๆ‰น่ฎฐๅฝ•๏ผš ๆŽงๅˆถๆฏๆฌก่ฟ่กŒๅฐ†่ฏปๅ–ๅ’Œๅ‘้€็š„ไบ‹ไปถๆ•ฐ้‡ใ€‚่พƒๅคง็š„ๆ‰นๆฌกๅฏไปฅๆ้ซ˜ๆ€ง่ƒฝ๏ผŒไฝ†้œ€่ฆๆ›ดๅคš็š„ๅ†…ๅญ˜ๅ’Œๅค„็†่ƒฝๅŠ›๏ผ›
  • ๆฃ€็ดขๆ”ฟ็ญ–๏ผš ๅฆ‚ๆžœๅ‘้€ๆถˆๆฏๅคฑ่ดฅ๏ผŒๆ‚จๅฏไปฅ้…็ฝฎไฝœไธšๅฐ่ฏ•้‡ๆ–ฐๅ‘้€็š„ๆฌกๆ•ฐใ€‚

่ฟ™ไบ›ๅ‚ๆ•ฐๅ–ๅ†ณไบŽ็ณป็ปŸ็š„ๅคงๅฐใ€ๆœบๅ™จๅฎน้‡ๅ’Œ้ข„ๆœŸ็š„ไบ‹ไปถ้‡ใ€‚

็ฌฌไธ‰ๆญฅ๏ผš็”Ÿๆˆ็ป“ๆž„

้…็ฝฎๅฎŒๆˆๅŽ๏ผŒ้กน็›ฎๅฐ†ๆœ‰ไธ€ไธชBackground Jobๅ‡†ๅค‡ๅค„็†ๆฅ่‡ช่กจ็š„ๆถˆๆฏ Outbox ๅœจๆฏ้กนๆœๅŠกไธญใ€‚

  1. ็”จไพ‹ๆ›ดๆ”นๅŸŸๅนถ่ฎฐๅฝ•ๅŸŸๆˆ–้›†ๆˆไบ‹ไปถใ€‚
  2. ๅทฅไฝœๅ•ๅ…ƒๅฐ†ๆฅ่‡ช Outbox ็š„ไธšๅŠกๆ•ฐๆฎๅ’Œๆถˆๆฏไฟๅญ˜ๅœจๅŒไธ€ไบ‹ๅŠกไธญใ€‚
  3. Hangfire ่ฟ่กŒๆ‰น้‡่ฏปๅ–ๅพ…ๅค„็†ๆถˆๆฏ็š„้‡ๅคไฝœไธšใ€‚
  4. ๅฝ“ๅฏ็”จๅผ‚ๆญฅ้€šไฟกๆ—ถ๏ผŒๆถˆๆฏๅฐ†ๅ‘ๅธƒๅˆฐ้…็ฝฎ็š„้›†ๆˆๅผ•ๆ“Ž๏ผŒไพ‹ๅฆ‚ RabbitMQใ€‚
  5. ๅทฒๅฎŒๆˆใ€ๅคฑ่ดฅใ€ๆ—ง็š„ๆˆ–ๅกไฝ็š„ๆถˆๆฏๅฏไปฅ็”ฑไธบไฝœไธš็”Ÿๆˆ็š„้€ป่พ‘ๅ’Œ้…็ฝฎๆฅๅค„็†ใ€‚

่ฟ™็กฎไฟไบ†ๆ‰€ๆœ‰้›†ๆˆไบ‹ไปถ้ƒฝๅพ—ๅˆฐๅฏ้ ใ€้ซ˜ๆ•ˆ็š„ๅค„็†๏ผŒๅ…่ฎธๅคšไธชๆœๅŠกๅ’Œๆจกๅ—ๅผ‚ๆญฅ้€šไฟก๏ผŒ่€Œไธๅฝฑๅ“ไธป็ณป็ปŸ็š„ๆ€ง่ƒฝใ€‚ ๆœ€้‡่ฆ็š„ๆ“ไฝœ่ง„ๅˆ™ๆ˜ฏไฟๆŒไบ‹ๅŠก่พน็•Œๆธ…ๆ™ฐ๏ผš้œ€่ฆ้€š่ฟ‡ Outbox ๅ‘้€็š„ไบ‹ไปถๅฟ…้กปๅœจไธŽๅ…ถไปฃ่กจ็š„ไธšๅŠกๆ›ดๆ”น็›ธๅŒ็š„ไบ‹ๅŠกๆตไธญๅˆ›ๅปบใ€‚

ๅˆ›ๅปบๅฎžไฝ“ๅ’Œๆžšไธพ

ๅœจๆœฌ่Š‚ไธญ๏ผŒๆˆ‘ไปฌๅฐ†่ฏฆ็ป†ไป‹็ปๅบ”็”จ็จ‹ๅบ็š„ๅฎžไฝ“ใ€ๆžšไธพๅ’ŒValue Object็š„่ฎพ่ฎก๏ผŒๆ˜พ็คบๆฏไธช้กน็›ฎๅฐ†ๅœจๅ“ชไบ›ๆœๅŠกๅ’Œๆจกๅ—ไธญๅˆ›ๅปบใ€‚

1. ๅˆ›ๅปบๅฎžไฝ“ Category

่ฆๅœจ Catalog ๆœๅŠกๅ’Œ Merchandising ๆจกๅ—ไธญๅˆ›ๅปบ Category entity๏ผŒ่ฏทๆ‰ง่กŒ๏ผš

lino entity new --service Catalog --module Merchandising --name Category

่ฏฅๅฎžไฝ“ๅฐ†ๅœจๆœๅŠกไธญๅˆ›ๅปบ Catalog ๅนถๅœจๆจกๅ—ไธญ Merchandising ๅ…ทๆœ‰ไปฅไธ‹็ป“ๆž„๏ผš

โ”Œโ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ PK โ”‚ FK โ”‚ Property name โ”‚ Type   โ”‚ Length โ”‚ Required โ”‚ Auto-increment โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ x  โ”‚    โ”‚ Id            โ”‚ Guid   โ”‚        โ”‚    x     โ”‚       x        โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚    โ”‚ Name          โ”‚ string โ”‚   50   โ”‚    x     โ”‚                โ”‚
โ””โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

2. ๅˆ›ๅปบๅฎžไฝ“ Product

ๆŽฅไธ‹ๆฅ๏ผŒๆˆ‘ไปฌๅœจๅŒไธ€ๆœๅŠกๅ’Œๆจกๅ—ไธญๅˆ›ๅปบ Product entityใ€‚ๅœจๆญคๆต็จ‹ไธญ๏ผŒValue Object ProductDimension ๅ’Œ enum ProductStatus ไผšไฝœไธบ Product aggregate ็š„ไธ€้ƒจๅˆ†๏ผŒๅœจ entity ๅˆ›ๅปบ wizard ๅ†…้ƒจ้…็ฝฎ๏ผš

lino entity new --service Catalog --module Merchandising --name Product

ๆ‰ง่กŒ่ฟ‡็จ‹ไธญ๏ผŒๆทปๅŠ ็ฎ€ๅ• propertiesใ€ไธŽ Category ็š„ relationshipใ€Value Object ็ฑปๅž‹็š„ Dimensions property๏ผŒไปฅๅŠ Enum ็ฑปๅž‹็š„ Status propertyใ€‚

โ”Œโ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ PK โ”‚ FK โ”‚ Property name โ”‚ Type        โ”‚ Length โ”‚ Required โ”‚ Auto-increment โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ x  โ”‚    โ”‚ Id            โ”‚ Guid        โ”‚        โ”‚    x     โ”‚       x        โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚    โ”‚ Name          โ”‚ string      โ”‚  100   โ”‚    x     โ”‚                โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚    โ”‚ Description   โ”‚ string      โ”‚  500   โ”‚    x     โ”‚                โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚    โ”‚ Price         โ”‚ decimal     โ”‚        โ”‚    x     โ”‚                โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚ x  โ”‚ CategoryId    โ”‚ Category    โ”‚        โ”‚    x     โ”‚                โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚    โ”‚ Dimensions    โ”‚ ValueObject โ”‚        โ”‚          โ”‚                โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚    โ”‚ Status        โ”‚ Enum        โ”‚        โ”‚    x     โ”‚                โ”‚
โ””โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

2.1 ๅœจ Product ๅ†…้…็ฝฎ Value Object ProductDimension

ๅœจๆœฌๆŒ‡ๅ—็š„ๅœบๆ™ฏไธญ๏ผŒProductDimension ไธๆ˜ฏ้€š่ฟ‡ๅ•็‹ฌๅ‘ฝไปคๅˆ›ๅปบ็š„ใ€‚ๅฎƒไผšๅœจ Product ็š„ lino entity new ่ฟ‡็จ‹ไธญไฝœไธบ Dimensions property ๆทปๅŠ ๏ผŒ็”จไบŽ่กจ็คบไบงๅ“ๅฐบๅฏธ๏ผš

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Property name โ”‚ Type    โ”‚ Length โ”‚ Required โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Width         โ”‚ decimal โ”‚        โ”‚    x     โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Height        โ”‚ decimal โ”‚        โ”‚    x     โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Depth         โ”‚ decimal โ”‚        โ”‚    x     โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ๆณจๆ„๏ผšlino value-object new ๅ‘ฝไปค้€‚็”จไบŽ้œ€่ฆๅ•็‹ฌๅˆ›ๅปบ Value Object ็š„ๅœบๆ™ฏใ€‚ๅœจ่ฟ™ไบ›ๆƒ…ๅ†ตไธ‹๏ผŒ่ฏทไฝฟ็”จ็›ฎๆ ‡ service ๅ’Œ module ๅ‚ๆ•ฐ๏ผš

lino value-object new --service <ServiceName> --module <ModuleName> --name <ValueObjectName>

2.2 ๅœจ Product ๅ†…้…็ฝฎ Enum ProductStatus

ๅŒๆ ท๏ผŒProductStatus ไผšๅœจ Product ็š„ lino entity new ไธญไฝœไธบ Status property ้…็ฝฎใ€‚ๅฎƒๅฎšไน‰ไบงๅ“็Šถๆ€๏ผš

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Value โ”‚ Name         โ”‚ Display Name โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ 1     โ”‚ Active       โ”‚ Active       โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ 2     โ”‚ Inactive     โ”‚ Inactive     โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ 3     โ”‚ Discontinued โ”‚ Discontinued โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ๆณจๆ„๏ผšๅฝ“้œ€่ฆๅœจๅ…ถไป–ๅœบๆ™ฏไธญๅ•็‹ฌๅˆ›ๅปบ enum ๆ—ถ๏ผŒไนŸๅฏไปฅไฝฟ็”จ lino enumeration new ๅ‘ฝไปค๏ผš

lino enumeration new --service <ServiceName> --module <ModuleName> --name <EnumerationName>

3. ๆทปๅŠ ๆ–ฐๅฑžๆ€ง

้š็€้กน็›ฎ็š„ๅ‘ๅฑ•๏ผŒๆˆ‘ไปฌๅฏไปฅ็ผ–่พ‘็Žฐๆœ‰ๅฎžไฝ“ไปฅๆทปๅŠ ๆ–ฐๅฑžๆ€งใ€‚ ไพ‹ๅฆ‚๏ผŒๆˆ‘ไปฌๅฐ†ๅ‘ๅฎžไฝ“ๆทปๅŠ ๅ›พๅƒๅˆ—่กจ Product:

lino entity edit --service Catalog --module Merchandising --entity Product

ๅœจๅŒไธ€ๆต็จ‹ไธญ๏ผŒๆˆ‘ไปฌๅˆ›ๅปบ็ฑปๅž‹ไธบ List<ProductImage> ็š„ Images propertyใ€‚็”ฑไบŽ ProductImage ๅฑžไบŽ Product aggregate๏ผŒๅฎƒ็š„็ป“ๆž„ไนŸไผšๅœจ Product ็š„ lino entity edit ่ฟ‡็จ‹ไธญ้…็ฝฎ๏ผš

โ”Œโ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ PK โ”‚ FK โ”‚ Property name โ”‚ Type               โ”‚ Length โ”‚ Required โ”‚ Auto-increment โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ x  โ”‚    โ”‚ Id            โ”‚ Guid               โ”‚        โ”‚    x     โ”‚       x        โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚    โ”‚ Name          โ”‚ string             โ”‚  100   โ”‚    x     โ”‚                โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚    โ”‚ Description   โ”‚ string             โ”‚  500   โ”‚    x     โ”‚                โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚    โ”‚ Price         โ”‚ decimal            โ”‚        โ”‚    x     โ”‚                โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚ x  โ”‚ CategoryId    โ”‚ EntityId           โ”‚        โ”‚    x     โ”‚                โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚    โ”‚ Dimensions    โ”‚ ValueObject        โ”‚        โ”‚          โ”‚                โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚    โ”‚ Status        โ”‚ Enum               โ”‚        โ”‚    x     โ”‚                โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚ x  โ”‚ Images        โ”‚ List โ”‚        โ”‚          โ”‚                โ”‚
โ””โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

3.1 ๅœจ Product ๅ†…้…็ฝฎ ProductImage

ๅœจๆญคๅœบๆ™ฏไธญ๏ผŒProductImage ไธๆ˜ฏ้€š่ฟ‡ๅ•็‹ฌๅ‘ฝไปคๅˆ›ๅปบ็š„ใ€‚ๅฎƒไผšๅœจ็ผ–่พ‘ Product ๆ—ถไฝœไธบ Images collection ็š„้กน่ฟ›่กŒ้…็ฝฎ๏ผŒๅนถๅ…ทๆœ‰ไปฅไธ‹็ป“ๆž„๏ผš

โ”Œโ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ PK โ”‚ FK โ”‚ Property name โ”‚ Type           โ”‚ Length โ”‚ Required โ”‚ Auto-increment โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ x  โ”‚    โ”‚ Id            โ”‚ Guid           โ”‚        โ”‚    x     โ”‚       x        โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚ x  โ”‚ ProductId     โ”‚ EntityId       โ”‚        โ”‚    x     โ”‚                โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚    โ”‚ UploadDate    โ”‚ DateTimeOffset โ”‚        โ”‚    x     โ”‚                โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚    โ”‚ Image         โ”‚ File           โ”‚        โ”‚    x     โ”‚                โ”‚
โ””โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ๆณจๆ„๏ผšlino entity new ๅ‘ฝไปค็”จไบŽๅœจๅ…ถไป–ๅœบๆ™ฏไธญๅˆ›ๅปบ็‹ฌ็ซ‹ entitiesใ€‚ๅฝ“ entity ไธๆ˜ฏ็ผ–่พ‘็Žฐๆœ‰ aggregate ็š„ไธ€้ƒจๅˆ†ๆ—ถ๏ผŒ่ฏทไฝฟ็”จ๏ผš

lino entity new --service <ServiceName> --module <ModuleName> --name <EntityName>

4. ไธบๅ…ถไป–ๆœๅŠกๅˆ›ๅปบๅฎžไฝ“

ๆœๅฝนไธญ Sales๏ผŒๆˆ‘ไปฌๅˆ›ๅปบๅฎžไฝ“ ProductSnapshot๏ผŒ่ฟ™ๅฐ†็”ฑ้›†ๆˆไบ‹ไปถๆไพ›ใ€‚ ไฝœไธบๅฎžไฝ“็š„ๅŽŸๅง‹Id Product ๆฅ่‡ชๆœๅŠก Catalog๏ผŒ่ฟ™้‡Œไธ่ƒฝ่‡ชๅขžใ€‚

lino entity new --service Sales --name ProductSnapshot
โ”Œโ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ PK โ”‚ FK โ”‚ Property name โ”‚ Type    โ”‚ Length โ”‚ Required โ”‚ Auto-increment โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ x  โ”‚    โ”‚ Id            โ”‚ Guid    โ”‚        โ”‚    x     โ”‚                โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚    โ”‚ Name          โ”‚ string  โ”‚  100   โ”‚    x     โ”‚                โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚    โ”‚ Price         โ”‚ decimal โ”‚        โ”‚    x     โ”‚                โ”‚
โ””โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ๆณจๆ„๏ผšๅฏนไบŽ Sales ๆœๅŠก๏ผŒๅชๅœจ ProductSnapshot ไธญๅคๅˆถไบ†ๅฟ…่ฆ fieldsใ€‚ไธบไบ†็ฎ€ๅŒ–ๆ–‡ๆกฃ๏ผŒCustomerใ€Order ๅ’Œ StockItem ็ญ‰่กฅๅ…… entities ไธๅœจๆญค่ฏฆ็ป†่ฏดๆ˜Žใ€‚ProductSnapshot ไฝœไธบ shadow entity ๅทฅไฝœ๏ผšๅฎƒๆ˜ฏ็”ฑๅ…ถไป–ๆœๅŠกๆ‹ฅๆœ‰็š„ๆ•ฐๆฎ็š„ๆœฌๅœฐใ€ๆœ€ๅฐไธ”ๅ—ๆŽง็š„ๅ‰ฏๆœฌใ€‚่ฟ™ๅ…่ฎธ Sales ๆŸฅ่ฏขๆ‰€้œ€็š„ไบงๅ“ๆ•ฐๆฎ๏ผŒ่€Œไธ็›ดๆŽฅไพ่ต– Catalog ็š„ entity ๆˆ– databaseใ€‚

่ฟ™็ง็ป“ๆž„ไนŸๅฏไปฅ้€š่ฟ‡ lino shadow new ๅ‘ฝไปคๅˆ›ๅปบ๏ผŒๅฎƒๆ˜ฏ lino shadow-entity new ็š„ๅˆซๅใ€‚ๅœจๆญคๆต็จ‹ไธญ๏ผŒLino ไผšๅคๅˆถๅฆไธ€ไธช service ๆˆ– module ไธญๆŸไธช entity ็š„็ป“ๆž„๏ผŒๅนถๅ…่ฎธๅช้€‰ๆ‹ฉๅฏนๆถˆ่ดน context ๆœ‰ๆ„ไน‰็š„ propertiesใ€‚

lino shadow new --service <ServiceName> --module <ModuleName> --name <ShadowEntityName>

ๅœจ็คบไพ‹ไธญ๏ผŒๆบ entity ๆ˜ฏ Catalog.Merchandising.Product๏ผŒ็›ฎๆ ‡ๆ˜ฏ Sales ๆœๅŠก๏ผŒไป…ไฟ็•™้”€ๅ”ฎๆ‰€้œ€็š„ fieldsใ€‚

ๅˆ›ๅปบไบ‹ไปถๅŠๅ…ถๅค„็†็จ‹ๅบ

ๅ›ž้กพไธ€ไธ‹๏ผŒๅœจไธŠไธ€ไธชไธป้ข˜ไธญ๏ผŒๆˆ‘ไปฌๅˆ›ๅปบไบ†ไธ€ไธชๆจกๅ—ๅŒ–ๆœๅŠก Catalog.Merchandising ๅฎžไฝ“ Product, Category ๅ’Œ ProductImage๏ผŒๅ€ผ็ญๆ—ถ Sales ๆˆ‘ไปฌๅˆ›ๅปบๅฎžไฝ“ ProductSnapshotใ€‚

็Žฐๅœจ๏ผŒ่ฎฉๆˆ‘ไปฌๅˆ›ๅปบๅŸŸไบ‹ไปถๅ’Œ้›†ๆˆไบ‹ไปถใ€‚็›ฎๆ ‡ๆ˜ฏๅœจๆœๅŠกไธŠๅˆ›ๅปบๆˆ–ๆ›ดๆ–ฐไบงๅ“ๆ—ถ Catalog๏ผŒ่ฟ™ไบ›ๅ˜ๅŒ–่ขซๅคๅˆถๅˆฐๆถˆ่ดน่€…ๆœๅŠกไธญ๏ผŒไพ‹ๅฆ‚ Sales ๅ’Œ Stockใ€‚

1. ๅˆ›ๅปบ้ข†ๅŸŸไบ‹ไปถ

็ฌฌไธ€ๆญฅๆ˜ฏๅˆ›ๅปบ้ข†ๅŸŸไบ‹ไปถ ProductCreated ๅ’Œ ProductUpdated ไฝฟ็”จๅ‘ฝไปค๏ผš

lino event new

ๅœจๅˆ›ๅปบ่ฟ‡็จ‹ไธญ๏ผŒๆˆ‘ไปฌๅฏไปฅๅฐ†ไบ‹ไปถไธŽๅค„็†็จ‹ๅบๅ…ณ่”่ตทๆฅ๏ผŒๅŒๆ—ถ้…็ฝฎ้›†ๆˆไบ‹ไปถ็š„่งฆๅ‘ใ€‚่ฟ™้›†ไธญไบ†ๆ‰€ๆœ‰ๅฟ…่ฆๆต็จ‹็š„ๅˆ›ๅปบใ€‚

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Question                                             โ”‚ Answer                         โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select a service:                                    โ”‚ Catalog                        โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select a module:                                     โ”‚ Merchandising                  โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select a entity:                                     โ”‚ Product                        โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select the event type:                               โ”‚ Domain Event                   โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Enter the name of the event:                         โ”‚ ProductCreated                 โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Do you want to create an associated event handler?   โ”‚ Yes                            โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Trigger a integration event?                         โ”‚ Yes                            โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Choose the integration event to be triggered:        โ”‚ (Create new integration event) โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Enter the name of the event:                         โ”‚ ProductCreated                 โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Which model will be used for this integration event? โ”‚ Creation model                 โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ๅŒๆ ท็š„ๆ–นๅผ๏ผŒๆˆ‘ไปฌๅˆ›ๅปบไบ‹ไปถ ProductUpdated:

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Question                                             โ”‚ Answer                         โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select a service:                                    โ”‚ Catalog                        โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select a module:                                     โ”‚ Merchandising                  โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select a entity:                                     โ”‚ Product                        โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select the event type:                               โ”‚ Domain Event                   โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Enter the name of the event:                         โ”‚ ProductUpdated                 โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Do you want to create an associated event handler?   โ”‚ Yes                            โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Trigger a integration event?                         โ”‚ Yes                            โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Choose the integration event to be triggered:        โ”‚ (Create new integration event) โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Enter the name of the event:                         โ”‚ ProductUpdated                 โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Which model will be used for this integration event? โ”‚ Update model                   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ๆœ‰ไบ†่ฟ™ไธช๏ผŒๆˆ‘ไปฌๆœ‰๏ผš

2. ๅˆ›ๅปบ้›†ๆˆไบ‹ไปถๅค„็†็จ‹ๅบ

ไธ‹ไธ€ๆญฅๆ˜ฏๅฎšไน‰ๅ“ชไบ›ๆœๅŠกๅฐ†ไฝฟ็”จ้›†ๆˆไบ‹ไปถใ€‚ไธบๆญค๏ผŒๆˆ‘ไปฌไฝฟ็”จ๏ผš

lino event-handler new

ๅˆ›ๅปบๆต็จ‹ๆถ‰ๅŠ๏ผš

ไพ‹ๅฆ‚๏ผŒๅœจๆœๅŠกไธญ Sales ๆˆ‘ไปฌๅˆ›ๅปบไบ†ๅค„็†็จ‹ๅบ ProductCreated ๅ’Œ ProductUpdated ่ฟ™ๅฐ†ๆถˆ่€—็”ฑ Catalog.Merchandising.Product:

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Question                                   โ”‚ Answer            โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select a service:                          โ”‚ Sales             โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select a entity:                           โ”‚ ProductSnapshot   โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select the event type:                     โ”‚ Integration Event โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select the event's service to be consumed: โ”‚ Catalog           โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select the event's module to be consumed:  โ”‚ Merchandising     โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select the event's entity to be consumed:  โ”‚ Product           โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Choose the event to be consumed:           โ”‚ ProductCreated    โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Enter the name of the event handler:       โ”‚ ProductCreated    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Question                                   โ”‚ Answer            โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select a service:                          โ”‚ Sales             โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select a entity:                           โ”‚ ProductSnapshot   โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select the event type:                     โ”‚ Integration Event โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select the event's service to be consumed: โ”‚ Catalog           โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select the event's module to be consumed:  โ”‚ Merchandising     โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select the event's entity to be consumed:  โ”‚ Product           โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Choose the event to be consumed:           โ”‚ ProductUpdated    โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Enter the name of the event handler:       โ”‚ ProductUpdated    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

่ฟ™ๆ ท๏ผŒๆˆ‘ไปฌๅœจๆœๅŠกไธญๆœ‰ไธคไธช้›†ๆˆไบ‹ไปถๅค„็†็จ‹ๅบ Sales๏ผŒไป…ๆถˆ่€—้›†ๆˆไบ‹ไปถไธญ็š„ๅฟ…่ฆๅญ—ๆฎต Catalog.Merchandisingใ€‚ ่ฟ™ๅฏ็กฎไฟๅคๅˆถ่กจไป…ไฟ็•™ๅŸบๆœฌๆ•ฐๆฎ๏ผŒไปŽ่€Œไผ˜ๅŒ–ๅญ˜ๅ‚จๅ’Œๆ€ง่ƒฝใ€‚ ๅœจๆžถๆž„ๆ–น้ข๏ผŒ้ข„ๆœŸ็š„ๆต็จ‹ๆ˜ฏ๏ผšๅ‘ฝไปคๅค„็†็จ‹ๅบๆ›ดๆ”น่šๅˆ๏ผŒๅผ•ๅ‘ๅŸŸไบ‹ไปถ๏ผŒๅค„็†็จ‹ๅบๅ‡†ๅค‡้›†ๆˆไบ‹ไปถ๏ผŒOutbox ๅญ˜ๅ‚จๆถˆๆฏ๏ผŒBackground Jobๅค„็†้—ฎ้ข˜๏ผŒๆถˆๆฏๅผ•ๆ“Žๅฐ†ๆถˆๆฏไผ ้€’็ป™ๆถˆ่ดน่€…ใ€‚ ่ฟ™้ฟๅ…ไบ†ๆœๅŠกไน‹้—ด็š„ๅŒๆญฅ่€ฆๅˆ๏ผŒๅนถ้™ไฝŽไบ†ๆ•ฐๆฎๅบ“่ขซๆ›ดๆ”น่€Œๆฒกๆœ‰ๅ‘ๅธƒ็›ธๅบ”ไบ‹ไปถ็š„้ฃŽ้™ฉใ€‚

็”Ÿๆˆ็ฝ‘้กตใ€APIใ€ๅ‘ฝไปคๅ’ŒๆŸฅ่ฏข

็š„ๅทจๅคงไผ˜ๅŠฟไน‹ไธ€ Lino CLI ๆ˜ฏๅ…่ฎธไปฅ่‡ชๅŠจๅŒ–็š„ๆ–นๅผ้›†ๆˆๅˆ›ๅปบ็ฝ‘้กตใ€APIใ€ๅ‘ฝไปคๅ’ŒๆŸฅ่ฏข๏ผŒไปŽ่€Œ็ฎ€ๅŒ–ๆ•ดไธชๅผ€ๅ‘ๆต็จ‹ใ€‚ ๅฝ“้ข†ๅŸŸๆจกๅž‹่ถณๅคŸ็จณๅฎšๆ—ถ๏ผŒๆญคๅ‘ฝไปคไผšๅˆ›ๅปบไปŽๅฑๅน•ๅˆฐๆŒไน…ๅŒ–็š„ๅฎŒๆ•ด่ทฏๅพ„๏ผŒไฝฟไน‹ๅ‰ๆญฅ้ชคไธญๅฎŒๆˆ็š„ๅปบๆจกๅทฅไฝœๅฏนๆœ€็ปˆ็”จๆˆทๅฏ่งใ€‚ ้ฆ–ๅ…ˆ๏ผŒๅช้œ€่ฟ่กŒๅ‘ฝไปค๏ผš

lino page new

ๅœจๆญค่ฟ‡็จ‹ไธญ๏ผŒๆ‚จๅฐ†๏ผš

้€š่ฟ‡่ฏฅๅ‘ฝไปค๏ผŒๆ‚จๆ— ้œ€ๆ‰‹ๅŠจ็ผ–ๅ†™ๆŽฅๅฃๅฑ‚ใ€APIๅ’ŒไธšๅŠก้€ป่พ‘๏ผŒๅณๅฏ่Žทๅพ—ๅŠŸ่ƒฝ้ฝๅ…จ็š„ๅบ”็”จ็จ‹ๅบ๏ผŒไฟๆŒๆœๅŠกไน‹้—ด็š„ๆ ‡ๅ‡†ๅ’Œไธ€่‡ดๆ€งใ€‚ ๅณไพฟๅฆ‚ๆญค๏ผŒ่ฏทๅœจ็”ŸๆˆๅŽๆฃ€ๆŸฅไธšๅŠก่ง„ๅˆ™ๅ’Œ้ชŒ่ฏ๏ผŒๅ› ไธบๅนถ้žๆฏไธช่ง„ๅˆ™้ƒฝๅฏไปฅๅ•็‹ฌไปŽๅฑžๆ€งๅ…ƒๆ•ฐๆฎๆŽจๆ–ญๅ‡บๆฅใ€‚

ๅฏนไบŽ่ฟ™ไธช้กน็›ฎ๏ผŒๆˆ‘ไปฌๅฏไปฅไธบไปฅไธ‹ๅฎžไฝ“็”Ÿๆˆ้›†ๆˆ้กต้ข๏ผš

็”Ÿๆˆ้กต้ขใ€API ๅ’Œๅ‘ฝไปค/ๆŸฅ่ฏขๅŽ๏ผŒๅบ”็”จ็จ‹ๅบๅฐ†ๅ‡†ๅค‡ๅฅฝๅœจๅ‰็ซฏๅ’ŒๅŽ็ซฏไน‹้—ดๅฎŒๅ…จไบคไบ’๏ผŒๅ…ถไธญ้ชŒ่ฏใ€่ทฏ็”ฑๅ’ŒๆŒไน…ๆ€งๅทฒ็”ฑ Lino CLIใ€‚ ่ท‘ๆญฅ dotnet build ็”ŸๆˆๅŽๅฐฝๆ—ฉ่ฏ†ๅˆซๆŸๅ็š„ๅ‚่€ƒใ€ไธไธ€่‡ด็š„ๅˆๅŒๆˆ–ๆœ€่ฟ‘ๆจกๅž‹ๆ›ดๆ”น็š„ๅฝฑๅ“ใ€‚

ๅˆ›ๅปบๅ’Œๅบ”็”จ่ฟ็งป

ๅˆ›ๅปบๆˆ–ๆ›ดๆ”นๅฎžไฝ“ใ€Value Objectใ€ๆžšไธพใ€ๅ…ณ็ณปใ€่บซไปฝ้ชŒ่ฏใ€็งŸๆˆทๆ”ฏๆŒๆˆ–Background JobๆŒไน…ๆ€งๅŽ๏ผŒ็”Ÿๆˆ่ฟ็งปไปฅไฟๆŒๆ•ฐๆฎๅบ“ๅ’Œไปฃ็ ไธ€่‡ดใ€‚่ฟ็งปๅฐ†ๆจกๅž‹ๆ›ดๆ”น่ฝฌๆขไธบๆ˜Ž็กฎ็š„ใ€ๅฏ็‰ˆๆœฌๅŒ–ไธ”ๅฏๅฎกๆŸฅ็š„ๅทฅไปถใ€‚

่ฟ™ Lino CLI ไธŽ Entity Framework ๅ่ฐƒๆญค่ฟ‡็จ‹๏ผŒ้€‰ๆ‹ฉๆญฃ็กฎ็š„ๆœๅŠก/ๆจกๅ—๏ผŒไฝฟ็”จๆœๅŠก็š„ๅฝ“ๅ‰็‰ˆๆœฌๅนถ็ป„็ป‡็”Ÿๆˆ็š„่„šๆœฌไปฅไฟƒ่ฟ›ๅฏ่ฟฝๆบฏๆ€งใ€‚

็ฌฌ 1 ๆญฅ๏ผšๅˆ›ๅปบ่ฟ็งป

่ฆๅˆ›ๅปบๆ–ฐ็š„่ฟ็งป๏ผŒ่ฏท่ฟ่กŒ๏ผš

lino database migrations add

่ฏฅๅ‘ฝไปค่ฟ˜ๅฏไปฅๆŽฅๅ—ๅˆซๅ๏ผŒไพ‹ๅฆ‚ lino database migrations new ๅ’Œ lino database migrations create๏ผŒไฝ†ๆ–‡ๆกฃไธญ็š„้ฆ–้€‰ๆ–นๅผๆ˜ฏ addใ€‚

ๅœจๆ‰ง่กŒ่ฟ‡็จ‹ไธญ๏ผŒๆ‚จๅฟ…้กปๅ‘Š็Ÿฅ๏ผš

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Question                                  โ”‚ Answer            โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select a service:                         โ”‚ Catalog           โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select a module:                          โ”‚ Merchandising     โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Current version of the service:           โ”‚ 0.1.0             โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Provide a description for this migration: โ”‚ Initial migration โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ๅฝ“ๆ‚จๅทฒ็ป็Ÿฅ้“ๆœๅŠกๅ’Œๆจกๅ—ๆ—ถ๏ผŒๅฏไปฅ็›ดๆŽฅ่พ“ๅ…ฅๆญคๆ•ฐๆฎ๏ผš

lino database migrations add --service <ServiceName> --module <ModuleName>

็ฌฌ2ๆญฅ๏ผš็”Ÿๆˆไป€ไนˆ

็กฎ่ฎคๅˆ›ๅปบๆ—ถ๏ผŒLino ไธบๆ‰€้€‰ๆœๅŠกๆˆ–ๆจกๅ—ๆŒไน…ๅŒ–้กน็›ฎๅ‡†ๅค‡ๆญฃ็กฎ็š„ Entity Framework ๅ‘ฝไปคใ€‚ๅœจๆจกๅ—ๅŒ–ๆœๅŠกไธญ๏ผŒ่ฟ็งปๅœจ็›ธๅบ”็š„ๆจกๅ—ไธญไฟๆŒ้š”็ฆป๏ผŒ้ฟๅ…ๆททๅˆๆฅ่‡ชไธๅŒไธŠไธ‹ๆ–‡็š„ๆ›ดๆ”นใ€‚

ๆญฅ้ชค 3๏ผšๅˆ—ๅ‡บๅนถๅบ”็”จ่ฟ็งป

ๅœจๅฐ†ๆ›ดๆ”นๅบ”็”จๅˆฐๆ•ฐๆฎๅบ“ไน‹ๅ‰๏ผŒ่ฏทๅˆ—ๅ‡บๅทฒ็Ÿฅ็š„่ฟ็งปๅนถ็กฎ่ฎค้ข„ๆœŸ็š„่ฟ็งปๆ˜ฏๅฆๅญ˜ๅœจ๏ผš

lino database migrations list --service <ServiceName> --module <ModuleName>

่ฆๅฐ†่ฟ็งปๅบ”็”จๅˆฐ้…็ฝฎ็š„็Žฏๅขƒ๏ผš

lino database migrations apply --service <ServiceName> --module <ModuleName>

ๅœจๆœฌๅœฐๅผ€ๅ‘ไธญ๏ผŒๆญคๆต็จ‹ๅŠ ๅฟซไบ†ๆจกๅž‹้ชŒ่ฏ้€Ÿๅบฆใ€‚ๅœจๅ…ฑไบซๆˆ–็”Ÿไบง็Žฏๅขƒไธญ๏ผŒ้€š่ฟ‡ๅ›ข้˜Ÿๅฎšไน‰็š„้ƒจ็ฝฒๆต็จ‹ๅบ”็”จ่ฟ็งป๏ผŒๅนถๅœจๅฟ…่ฆๆ—ถ่ฟ›่กŒ่„šๆœฌๅฎกๆŸฅใ€ๆ‰นๅ‡†ๅ’Œๅค‡ไปฝใ€‚

็ฌฌ 4 ๆญฅ๏ผšๅœจๅ—ๆŽง็Žฏๅขƒไธญๅ่ฝฌๆˆ–็งป้™ค

ไฝฟ็”จ revert ๅฝ“ๆ‚จ้œ€่ฆ่ฟ”ๅ›žๅœจๅ—ๆŽง็Žฏๅขƒไธญๅบ”็”จ็š„่ฟ็งปๆ—ถ๏ผŒ่ฏทไบ†่งฃ่ฏฅๆ“ไฝœๅฏ่ƒฝไผšๆ นๆฎ่ฟ็งป็š„ๅ†…ๅฎนๆ‰ง่กŒ็ ดๅๆ€งๅ‘ฝไปค๏ผš

lino database migrations revert --service <ServiceName> --module <ModuleName>

ไฝฟ็”จ remove ้€šๅธธๅœจๆไบคๆˆ–ๅ‘ๅธƒๆ›ดๆ”นไน‹ๅ‰ๆ”พๅผƒๆœ€ๅŽไธ€ไธชๆœชๆไบค็š„่ฟ็งป๏ผš

lino database migrations remove --service <ServiceName> --module <ModuleName>

่‰ฏๅฅฝๅšๆณ•

้€š่ฟ‡้ตๅพชๆญคๆต็จ‹๏ผŒๆ•ฐๆฎๅบ“ไธŽ Lino ไธญๅฎšไน‰็š„ๅŸŸๆจกๅž‹ไฟๆŒไธ€่‡ด๏ผŒๅนถไธ”ๆฏไธชๆžถๆž„ๆ›ดๆ”น้ƒฝ่ขซ่ฎฐๅฝ•ไธ‹ๆฅใ€ๅฏ่ทŸ่ธชๅนถๅ‡†ๅค‡ๅœจ้ƒจ็ฝฒไน‹ๅ‰่ฟ›่กŒๅฎกๆŸฅใ€‚

ๆญฅ้ชค 5๏ผšๅœจๆœฌๅœฐ้ชŒ่ฏๅบ”็”จ็จ‹ๅบ

ๅฝ“ projectใ€Web Appใ€servicesใ€modulesใ€entitiesใ€migrationsใ€APIsใ€Commands ๅ’Œ Queries ๅ‡†ๅค‡ๅฅฝๅŽ๏ผŒ่ฏทๅœจ็”Ÿๆˆ Docker images ไน‹ๅ‰้ชŒ่ฏๅบ”็”จ็จ‹ๅบใ€‚้ฆ–ๅ…ˆ๏ผŒๆž„ๅปบ solution๏ผŒ็กฎ่ฎคๆ‰€ๆœ‰็”Ÿๆˆ็š„ projectsใ€contracts ๅ’Œ clients ไป็„ถไธ€่‡ด๏ผš

dotnet build

็„ถๅŽ๏ผŒ้€š่ฟ‡ Aspire AppHost ่ฟ่กŒๅบ”็”จ็จ‹ๅบ๏ผš

dotnet run --project src/Aspire/AppHost/<ProjectName>.AppHost.csproj

ไฝฟ็”จ Aspire dashboard ๆฃ€ๆŸฅ APIsใ€Web Appใ€databaseใ€cacheใ€messaging ๅ’Œ Background Jobs ๆ˜ฏๅฆๆญฃ็กฎๅฏๅŠจใ€‚ไน‹ๅŽ๏ผŒๅœจ Backoffice ไธญๆต‹่ฏ•ไธป่ฆ flows๏ผš็”Ÿๆˆ็š„ pagesใ€Blazor ๅฏน Api.Client ้กน็›ฎ็š„่ฐƒ็”จใ€ๅทฒๅบ”็”จ็š„ migrationsใ€ๅฏ็”จๆ—ถ็š„ authentication๏ผŒไปฅๅŠๅœบๆ™ฏไธญๅŒ…ๅซ็š„ events ๆˆ– jobsใ€‚

ๅฝ“ๅบ”็”จ็จ‹ๅบ่ƒฝๅคŸๆž„ๅปบใ€ๅœจๆœฌๅœฐ่ฟ่กŒ๏ผŒๅนถไธ”ไธป่ฆ flows ๅทฒ้ชŒ่ฏๅŽ๏ผŒproject ๅฐฑๅฏไปฅ่ฟ›ๅ…ฅ packaging ้˜ถๆฎตใ€‚

็”Ÿๆˆ Docker ๅ›พๅƒ

ๅฝ“ๅบ”็”จ็จ‹ๅบ่ƒฝๅคŸๆž„ๅปบใ€้€š่ฟ‡ AppHost ๅœจๆœฌๅœฐ่ฟ่กŒ๏ผŒๅนถไธ”ไธป่ฆ flows ๅทฒ็ป่ฟ‡ๆต‹่ฏ•ๅŽ๏ผŒไฝ ๅฏไปฅไธบ services ๅ’Œ web applications ็”Ÿๆˆ Docker images๏ผŒไปฅไพฟๅŽ็ปญๅ‘ๅธƒๅˆฐ container registryใ€‚ ๅฝ“้€‰ๅฎš้กน็›ฎๅทฒๅ‡†ๅค‡ๅฅฝไฝœไธบ images ๆ‰“ๅŒ…ๆ—ถ๏ผŒ่ฏทไฝฟ็”จ lino buildใ€‚

่ฟ™ Lino CLI ไฝฟ็”จไปฅไธ‹ๅ‘ฝไปค็ฎ€ๅŒ–ๆญค่ฟ‡็จ‹๏ผš

lino build

่ฟ่กŒๆ—ถ๏ผŒๆ‚จๅฐ†็œ‹ๅˆฐ้กน็›ฎไธญๅฏ็”จ็š„ๆ‰€ๆœ‰ๆœๅŠกๅ’Œ Web ๅบ”็”จ็จ‹ๅบๅŠๅ…ถๅฝ“ๅ‰็‰ˆๆœฌ็š„ๅˆ—่กจ๏ผš

Select the services or web applications you want to include in the build:

> [ ] Services
    [ ] Catalog |0.1.0|
    [ ] Sales |0.1.0|
    [ ] Security |0.1.0|
    [ ] Stock |0.1.0|
  [ ] Web applications
    [ ] Backoffice |0.1.0|

ๆ‚จๅฏไปฅ้€‰ๆ‹ฉไธ€้กนๆˆ–ๅคš้กนๆœๅŠกๅ’Œ Web ๅบ”็”จ็จ‹ๅบๆฅๅŒๆ—ถ็”Ÿๆˆๅ›พๅƒใ€‚ๅช้œ€ๆ ‡่ฎฐๆ‰€้œ€็š„้กน็›ฎๅณๅฏใ€‚

็„ถๅŽ๏ผŒ็ณป็ปŸไผš่ฆๆฑ‚ๆ‚จ้€‰ๆ‹ฉๅฆ‚ไฝ•ๆ›ดๆ–ฐ็”Ÿๆˆ็š„ๅ›พๅƒ็š„็‰ˆๆœฌใ€‚ๅฏ็”จ็š„้€‰้กนๆœ‰๏ผš

้€‰ๆ‹ฉๆœๅŠกๅนถๅฎšไน‰็‰ˆๆœฌๅขž้‡ๅŽ๏ผŒ Lino CLI ๆ‰ง่กŒ๏ผš

ๅœจ่ฏฅ่ฟ‡็จ‹็ป“ๆŸๆ—ถ๏ผŒ่€ƒ่™‘ๅˆฐๆ‰€ๆœ‰ Web ๆœๅŠกๅ’Œๅบ”็”จ็จ‹ๅบๅ‡ๅทฒ้€‰ๆ‹ฉ๏ผŒ็”Ÿๆˆ็š„ๅ›พๅƒๅฐ†ๅ…ทๆœ‰ไปฅไธ‹็ป“ๆž„๏ผš

ไธ€่ˆฌๆฅ่ฏด๏ผŒ็ฎ€ๅ•็š„ๆœๅŠกๅพ€ๅพ€ไผš็”Ÿๆˆ็ฑปไผผ็š„ๅญ˜ๅ‚จๅบ“ project-name/services/service-name-api:1.2.3๏ผŒๆจกๅ—ๅŒ–ๆœๅŠกไฝฟ็”จไธปๆœบไฝœไธบ project-name/services/service-name-host:1.2.3๏ผŒๅ’Œ Blazor ๅบ”็”จ็จ‹ๅบไฝฟ็”จ็ฑปไผผ็š„่ทฏๅพ„ project-name/webapps/webapp-name:1.2.3ใ€‚

่ง‚ๅฏŸ๏ผš ่ฟ™ไธช่ฟ‡็จ‹ไฟ่ฏไบ†Docker้•œๅƒ็š„ไปฃ็ ๅ’Œ็‰ˆๆœฌ็š„ไธ€่‡ดๆ€ง๏ผŒๆ–นไพฟๅคš็Žฏๅขƒ็š„้ƒจ็ฝฒๅ’Œ็ปดๆŠค๏ผŒๅŒๆ—ถไนŸๅฏไปฅ่ฎฉๆฏไธชๆœๅŠก้š”็ฆปๅœจ็‹ฌ็ซ‹็š„ๅฎนๅ™จไธญใ€‚ ็”Ÿๆˆๆœฌๅœฐ้•œๅƒๅŽ๏ผŒๅฐ†ๅ…ถๅ‘ๅธƒๅˆฐๆ‚จ็š„้ƒจ็ฝฒๅนณๅฐไฝฟ็”จ็š„ๆณจๅ†Œ่กจ๏ผŒไพ‹ๅฆ‚ Docker Hubใ€GitHub ๅฎนๅ™จๆณจๅ†Œ่กจใ€AWS ECRใ€Azure ๅฎนๅ™จๆณจๅ†Œ่กจๆˆ–ๅ…ถไป–็ฌฆๅˆ OCI ็š„ๆณจๅ†Œ่กจใ€‚่ฏทๅ‹ฟๅœจๆ˜ ๅƒไธญๅŒ…ๅซๆœบๅฏ†ใ€็”Ÿไบง่ฟžๆŽฅๅญ—็ฌฆไธฒๆˆ–ๅ‡ญๆฎใ€‚

ๅœจๅบ”็”จ็จ‹ๅบไธญๅˆ›ๅปบ็‰ˆๆœฌ

Lino ็ปดๆŠคๅ„ไธชๆœๅŠก็š„่ฟ่กŒ็‰ˆๆœฌ src/Services/<ServiceName>/version.txt ๅ’Œๆฏไธช็ฝ‘็ปœๅบ”็”จ็จ‹ๅบ src/WebApps/<WebAppName>/version.txtใ€‚่ฟ™ๅ…่ฎธๆ‚จไธบๆฏไธชๅฏ้ƒจ็ฝฒ้กน็›ฎ่ง„ๅˆ’็‹ฌ็ซ‹็‰ˆๆœฌใ€‚

ๅœจๆ›ดๆ”น็‰ˆๆœฌไน‹ๅ‰๏ผŒๆฃ€ๆŸฅๅฝ“ๅ‰็Šถๆ€๏ผš

lino version list

ไฝฟ็”จ lino version show ๅฝ“ๆ‚จ้œ€่ฆๅ’จ่ฏข็‰นๅฎšๆœๅŠกๆˆ–็ฝ‘็ปœๅบ”็”จ็จ‹ๅบๆ—ถใ€‚

ๅขžๅŠ  Web ๆœๅŠกๆˆ–ๅบ”็”จ็จ‹ๅบ็š„ๆ–ฐ็‰ˆๆœฌๆ˜ฏไธ€ไธช็ฎ€ๅ•ไธ”้›†ไธญ็š„่ฟ‡็จ‹ใ€‚ Lino CLIใ€‚ๅช้œ€่ฟ่กŒๅ‘ฝไปค๏ผš

lino version bump

ๅฐฑๅƒ็”Ÿๆˆ Docker ๅ›พๅƒไธ€ๆ ท๏ผŒๅฝ“ๆ‚จ่ฟ่กŒๆญคๅ‘ฝไปคๆ—ถ๏ผŒๆ‚จๅฐ†็œ‹ๅˆฐ้กน็›ฎไธญๆ‰€ๆœ‰ๆœๅŠกๅ’Œ Web ๅบ”็”จ็จ‹ๅบ็š„ๅฎŒๆ•ดๅˆ—่กจใ€‚ ไป…ๆ‚จ้€‰ๆ‹ฉ็š„้กน็›ฎ็š„็‰ˆๆœฌไผšๅขžๅŠ ๏ผŒๅ…ถไฝ™้กน็›ฎไฟๆŒไธๅ˜ใ€‚

Select the services or web applications that will have version changes:

> [ ] Services
    [ ] Catalog |0.1.0|
    [ ] Sales |0.1.0|
    [ ] Security |0.1.0|
    [ ] Stock |0.1.0|
  [ ] Web applications
    [ ] Backoffice |0.1.0|

้€‰ๆ‹ฉๆ‰€้œ€็š„้กน็›ฎๅŽ๏ผŒ็ณป็ปŸไผš่ฆๆฑ‚ๆ‚จ้€‰ๆ‹ฉ็‰ˆๆœฌๅขž้‡็š„็ฑปๅž‹ใ€‚ๅฏ็”จ็š„้€‰้กนๆœ‰๏ผš

้œ€่ฆๅผบ่ฐƒ็š„ๆ˜ฏ๏ผŒWeb ๆœๅŠกๅ’Œๅบ”็”จ็จ‹ๅบ็š„็‰ˆๆœฌๅฏนไปฅไธ‹ๆ–น้ขๆœ‰็›ดๆŽฅๅฝฑๅ“๏ผš

ๅœจๅบ”็”จ็ขฐๆ’žไน‹ๅ‰๏ผŒ่ฏทๆฃ€ๆŸฅๅ‘ๅธƒไธญๅŒ…ๅซ็š„ไปฃ็ ๆ›ดๆ”นใ€่ฟ็งปใ€้›†ๆˆไบ‹ไปถใ€API ๅˆ็บฆๅ’Œๅ‰็ซฏๆ›ดๆ”นใ€‚ไธ€ไธช็‰ˆๆœฌ ไฟฎ่กฅ ๅฟ…้กปไปฃ่กจๅ…ผๅฎน็š„ไฟฎๅค๏ผŒ ๆฌก่ฆ็š„ ๅฟ…้กปไปฃ่กจๅ…ผๅฎน็š„ๆทปๅŠ ๏ผŒๅนถไธ” ไธป่ฆ็š„ ๅฎƒๅบ”่ฏฅไฟ็•™็”จไบŽ้œ€่ฆๆถˆ่ดน่€…้€‚ๅบ”็š„ๅ˜ๅŒ–ใ€‚

่‡ณๆญค๏ผŒๆˆ‘ไปฌๆ€ป็ป“ไบ†ไฝฟ็”จไปฅไธ‹ๅ‘ฝไปคๆž„ๅปบ Web ้กน็›ฎ็š„ๆ‰€ๆœ‰ๅŸบๆœฌๅ‘ฝไปค็š„ๅˆ†ๆญฅๆŒ‡ๅ—๏ผš Lino CLI๏ผŒไปŽๅฎ‰่ฃ…ใ€ๅˆ›ๅปบๆœๅŠกใ€ๅฎžไฝ“ใ€ไบ‹ไปถๅ’Œ้กต้ข๏ผŒๅˆฐ Docker ๆ˜ ๅƒ็”Ÿๆˆๅ’Œ็‰ˆๆœฌๆŽงๅˆถใ€‚ ๅฎŒๆ•ด็š„ๆต็จ‹ๆ˜ฏๅฏ่ฟฝ่ธช็š„๏ผšๅปบๆจกๅŸŸใ€็”Ÿๆˆ็”จไพ‹ๅ’Œๅฑๅน•ใ€้€š่ฟ‡ๆž„ๅปบๅ’Œๆต‹่ฏ•่ฟ›่กŒ้ชŒ่ฏใ€ๅˆ›ๅปบ่ฟ็งปใ€ๅ‘ๅธƒๅธฆๆœ‰็‰ˆๆœฌๆ ‡็ญพ็š„ๆ˜ ๅƒไปฅๅŠๅ‘ๅธƒๅ…ทๆœ‰ๆ˜พๅผ SemVer ๅ€ผ็š„ๆฏไธชๆœๅŠกๆˆ– Web ๅบ”็”จ็จ‹ๅบใ€‚

ไธ่ฆๅฟ˜่ฎฐๅ…ณๆณจๆˆ‘ไปฌ็š„้ข‘้“ YouTube ้ตๅพช่ฏฆ็ป†็š„ๆ•™็จ‹ใ€ๅฎž็”จๆผ”็คบๅ’Œไฝฟ็”จ่ฏฅๅทฅๅ…ท็š„ๆŠ€ๅทง๏ผŒไปŽ็ฎ€ๅ•็š„ๆ“ไฝœๅˆฐ้ซ˜็บงๅŠŸ่ƒฝใ€‚

发生了未处理的错误。 重新加载 ๐Ÿ—™