ドメインモデリング

ใƒ‰ใƒกใ‚คใƒณ้ง†ๅ‹•่จญ่จˆใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณใฎไธญๅฟƒใซใฏใ€ใ‚ทใ‚นใƒ†ใƒ ใฎไธญๆ ธ็š„ใช็Ÿฅ่ญ˜ใจใƒ“ใ‚ธใƒใ‚นใƒซใƒผใƒซใ‚’่กจใ™ใƒขใƒ‡ใƒซใŒใ‚ใ‚Šใพใ™ใ€‚ใƒ‰ใƒกใ‚คใƒณใ‚’้ฉๅˆ‡ใซใƒขใƒ‡ใƒชใƒณใ‚ฐใ™ใ‚‹ใ“ใจใฏใ€็พๅฎŸไธ–็•Œใฎๆฆ‚ๅฟตใ‚’่กจ็พๅŠ›่ฑŠใ‹ใงใ€ไธ€่ฒซๆ€งใŒใ‚ใ‚Šใ€ใพใจใพใ‚Šใฎใ‚ใ‚‹ใ‚ฝใƒ•ใƒˆใ‚ฆใ‚งใ‚ขๆง‹้€ ใซๅค‰ๆ›ใ™ใ‚‹ใ“ใจใ‚’ๆ„ๅ‘ณใ—ใพใ™ใ€‚

ใ‚จใƒณใƒ†ใ‚ฃใƒ†ใ‚ฃ

ใ‚จใƒณใƒ†ใ‚ฃใƒ†ใ‚ฃใจใฏใ€ไธปใซใใฎ่ญ˜ๅˆฅๆ€งใซใ‚ˆใฃใฆๅฎš็พฉใ•ใ‚Œใ‚‹ใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใงใ‚ใ‚Šใ€ๅ˜ใซๅฑžๆ€งใ ใ‘ใงๅฎš็พฉใ•ใ‚Œใ‚‹ใ‚‚ใฎใงใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚ ๅฑžๆ€งใŒๆ™‚้–“ใฎ็ตŒ้Žใจใจใ‚‚ใซๅค‰ใ‚ใฃใฆใ‚‚ใ€ใ‚จใƒณใƒ†ใ‚ฃใƒ†ใ‚ฃใฎ่ญ˜ๅˆฅๆ€งใฏๅค‰ใ‚ใ‚Šใพใ›ใ‚“ใ€‚

ไธปใช็‰นๅพด๏ผš

  • ไธ€ๆ„ใฎ่ญ˜ๅˆฅๅญใ‚’ๆŒใค๏ผˆ้€šๅธธใฏId๏ผ‰ใ€‚
  • ้‡่ฆใชใฎใฏใ‚จใƒณใƒ†ใ‚ฃใƒ†ใ‚ฃใŒไฝ•ใ‚’ๅซใ‚“ใงใ„ใ‚‹ใ‹ใงใฏใชใใ€่ชฐใงใ‚ใ‚‹ใ‹ใงใ™ใ€‚
  • ๅฑžๆ€งใฏๆ™‚้–“ใจใจใ‚‚ใซๅค‰ๅŒ–ใ™ใ‚‹ใ“ใจใŒใ‚ใ‚Šใพใ™ใ€‚

Linoใงใ‚จใƒณใƒ†ใ‚ฃใƒ†ใ‚ฃใ‚’ไฝœๆˆใ™ใ‚‹

Linoใ‚’ไฝฟใฃใฆๆ–ฐใ—ใ„ใ‚จใƒณใƒ†ใ‚ฃใƒ†ใ‚ฃใ‚’ไฝœๆˆใ™ใ‚‹ใซใฏใ€ไปฅไธ‹ใ‚’ๅฎŸ่กŒใ—ใพใ™๏ผš

lino entity new

CLIใ‚ฆใ‚ฃใ‚ถใƒผใƒ‰ใŒไปฅไธ‹ใ‚’ๅฐ‹ใญใพใ™๏ผš

  • ใ‚ตใƒผใƒ“ใ‚น โ€“ ใ‚จใƒณใƒ†ใ‚ฃใƒ†ใ‚ฃใ‚’ไฝœๆˆใ™ใ‚‹ใ‚ตใƒผใƒ“ใ‚นใ€‚
  • ใƒขใ‚ธใƒฅใƒผใƒซ โ€“ ใ‚จใƒณใƒ†ใ‚ฃใƒ†ใ‚ฃใ‚’ไฝœๆˆใ™ใ‚‹ใƒขใ‚ธใƒฅใƒผใƒซ๏ผˆใƒขใ‚ธใƒฅใƒฉใƒผใ‚ตใƒผใƒ“ใ‚นใฎๅ ดๅˆ๏ผ‰ใ€‚
  • ใ‚จใƒณใƒ†ใ‚ฃใƒ†ใ‚ฃๅ โ€“ ใƒ‰ใƒกใ‚คใƒณใŠใ‚ˆใณใƒ‡ใƒผใ‚ฟใƒ™ใƒผใ‚นใƒ†ใƒผใƒ–ใƒซใงไฝฟ็”จใ•ใ‚Œใ‚‹ๅๅ‰ใ€‚

ใใฎๅพŒใ€ๅ„ใƒ•ใ‚ฃใƒผใƒซใƒ‰ใ‚’่จญๅฎšใ—ใฆใ‚จใƒณใƒ†ใ‚ฃใƒ†ใ‚ฃใ‚’ๆง‹ๆˆใ—ใพใ™ใ€‚

ๅˆฉ็”จๅฏ่ƒฝใชใƒ•ใ‚ฃใƒผใƒซใƒ‰ใ‚ฟใ‚คใƒ—

ใ‚ฟใ‚คใƒ— ่ชฌๆ˜Ž ็ฏ„ๅ›ฒ๏ผๅ‚™่€ƒ
short16ใƒ“ใƒƒใƒˆๆ•ดๆ•ฐ-32,768 ๏ฝž 32,767
int32ใƒ“ใƒƒใƒˆๆ•ดๆ•ฐ-2,147,483,648 ๏ฝž 2,147,483,647
long64ใƒ“ใƒƒใƒˆๆ•ดๆ•ฐ-9,223,372,036,854,775,808 ๏ฝž 9,223,372,036,854,775,807
stringใƒ†ใ‚ญใ‚นใƒˆ็ด„20ๅ„„ๆ–‡ๅญ—ใพใง
bool็œŸๅฝๅ€คtrue ใพใŸใฏ false
Guidใ‚ฐใƒญใƒผใƒใƒซไธ€ๆ„่ญ˜ๅˆฅๅญๅˆ†ๆ•ฃไธ€ๆ„ๆ€ง
decimal้ซ˜็ฒพๅบฆๅฐๆ•ฐ้‡‘่žๅ€คใซๆœ€้ฉ
floatๆตฎๅ‹•ๅฐๆ•ฐ็‚นๆ•ฐ๏ผˆ32ใƒ“ใƒƒใƒˆ๏ผ‰็ด„6๏ฝž9ๆกใฎ็ฒพๅบฆ
doubleๆตฎๅ‹•ๅฐๆ•ฐ็‚นๆ•ฐ๏ผˆ64ใƒ“ใƒƒใƒˆ๏ผ‰็ด„15๏ฝž17ๆกใฎ็ฒพๅบฆ
DateTimeๆ—ฅๆ™‚ใ‚ฟใ‚คใƒ ใ‚พใƒผใƒณๅซใ‚€
DateOnlyๆ—ฅไป˜ใฎใฟ (C# 10+)โ€“
TimeOnlyๆ™‚้–“ใฎใฟ (C# 10+)โ€“
Entityๅˆฅใฎใ‚จใƒณใƒ†ใ‚ฃใƒ†ใ‚ฃใธใฎๅ‚็…ง1๏ผš1 ใพใŸใฏ 1๏ผšN
Value Objectไธๅค‰ใฎ Value Objectไพ‹๏ผšไฝๆ‰€ใ€CPF
Enumๅˆ—ๆŒ™ๅž‹ๅ›บๅฎšใ•ใ‚ŒใŸๅ€คใฎ้›†ๅˆ
List<Entity>ใ‚จใƒณใƒ†ใ‚ฃใƒ†ใ‚ฃใฎใƒชใ‚นใƒˆ1๏ผšN
ManyToManyๅคšๅฏพๅคš็ตๅˆใƒ†ใƒผใƒ–ใƒซใŒๅฟ…่ฆ

ไพ‹

Person ใ‚จใƒณใƒ†ใ‚ฃใƒ†ใ‚ฃใ‚’ไฝœๆˆใ™ใ‚‹ไพ‹๏ผš

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

Linoใซใ‚ˆใฃใฆ็”Ÿๆˆใ•ใ‚ŒใŸๆง‹้€ :

<ProjectName>/
โ””โ”€โ”€ src/
    โ””โ”€โ”€ Services/
        โ””โ”€โ”€ <ServiceName>/
            โ””โ”€โ”€ Domain/
                โ”œโ”€โ”€ <ProjectName>.<ServiceName>.Domain.csproj
                โ””โ”€โ”€ Aggregates/
                    โ””โ”€โ”€ People/
                        โ”œโ”€โ”€ Person.cs
                        โ”œโ”€โ”€ Errors/
                        โ”‚   โ””โ”€โ”€ PersonErrors.cs
                        โ”œโ”€โ”€ Repositories/
                        โ”‚   โ””โ”€โ”€ IPersonRepository.cs
                        โ””โ”€โ”€ Resources/
                            โ””โ”€โ”€ Person/
                                โ”œโ”€โ”€ PersonResources.resx
                                โ”œโ”€โ”€ PersonResources.en.resx
                                โ””โ”€โ”€ PersonResources.pt-BR.resx

ใ‚จใƒณใƒ†ใ‚ฃใƒ†ใ‚ฃใ‚’ๅฎš็พฉใ—ใŸๅพŒใ€Linoใ‚’ไฝฟใฃใฆMigrationsใ‚’็ฎก็†ใ—ใ€ใƒ‡ใƒผใ‚ฟใƒ™ใƒผใ‚นใ‚’ๅŒๆœŸใ•ใ›ใพใ™ใ€‚ ใ“ใฎใƒ—ใƒญใ‚ปใ‚นใฏใ€Œๆฐธ็ถšๅŒ–ใƒฌใ‚คใƒคใƒผใ€ใ‚ปใ‚ฏใ‚ทใƒงใƒณใง่ฉณใ—ใ่ชฌๆ˜Žใ—ใพใ™ใ€‚

็พๅœจใฎ้€ฒๅŒ–ใƒฏใƒผใ‚ฏใƒ•ใƒญใƒผ

lino entity new ใฎๅฏพ่ฉฑๅž‹ใƒ•ใƒญใƒผใซๅŠ ใˆใฆใ€ใ‚ตใƒผใƒ“ใ‚นใ€ใƒขใ‚ธใƒฅใƒผใƒซใ€ๅๅ‰ใŒใ™ใงใซๅˆ†ใ‹ใฃใฆใ„ใ‚‹ๅ ดๅˆใฏใ€CLI ใฎใ‚ณใƒžใƒณใƒ‰ไธŠใงๆ„ๅ›ณใ‚’ๆ˜Ž็คบใงใใพใ™๏ผš

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

ๅคงใใชใƒขใ‚ธใƒฅใƒผใƒซใงๆ–ฐใ—ใ„ๆฆ‚ๅฟตใ‚’ไฝœๆˆใ™ใ‚‹ๅ‰ใซใ€entity list ใ‚’ไฝฟ็”จใ—ใฆใใ ใ•ใ„ใ€‚็ทจ้›†ๆ™‚ใซใฏใ€่ญ˜ๅˆฅๅญใ€ใƒ—ใƒญใƒ‘ใƒ†ใ‚ฃใ€ๅฟ…้ ˆๆ€งใ€้•ทใ•ใ€ใƒชใƒฌใƒผใ‚ทใƒงใƒณใ€ใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นใ€ownershipใ€tenantใ€migrations ใธใฎๅฝฑ้Ÿฟใ‚’็ขบ่ชใ—ใพใ™ใ€‚

Strongly Typed IDsใ€ownershipใ€invariants

Strongly Typed IDs ใŒๆœ‰ๅŠนใชๅ ดๅˆใ€่ญ˜ๅˆฅๅญใฏ ProductId ใฎใ‚ˆใ†ใชๅฐ‚็”จๅž‹ใซใชใ‚Šใ€็•ฐใชใ‚‹ใ‚จใƒณใƒ†ใ‚ฃใƒ†ใ‚ฃใฎ IDs ใ‚’่ชคใฃใฆๅ–ใ‚Š้•ใˆใ‚‹ๅฏ่ƒฝๆ€งใ‚’ๆธ›ใ‚‰ใ—ใพใ™ใ€‚ใƒชใƒฌใƒผใ‚ทใƒงใƒณใฏใƒ‰ใƒกใ‚คใƒณไธŠใฎๅฎŸ้š›ใฎ ownership ใ‚’ๅๆ˜ ใ™ใ‚‹ในใใงใ™ใ€‚ใ™ในใฆใฎๅ‚็…งใ‚’็›ดๆŽฅใƒŠใƒ“ใ‚ฒใƒผใ‚ทใƒงใƒณใซใ™ใ‚‹ๅฟ…่ฆใฏใชใใ€ๅคšใใฎๅ ดๅˆใ€่ญ˜ๅˆฅๅญใ€shadow entityใ€integration eventใ€ใพใŸใฏๆ˜Ž็คบ็š„ใชใ‚ฏใ‚จใƒชใฎๆ–นใŒใƒขใ‚ธใƒฅใƒผใƒซๅขƒ็•Œใ‚’ใ‚ˆใ‚Šใ‚ˆใไฟ่ญทใ—ใพใ™ใ€‚

invariants ใฏ UIใ€ใƒ‡ใƒผใ‚ฟใƒ™ใƒผใ‚นใ€validators ใ ใ‘ใงใชใใ€ใƒ‰ใƒกใ‚คใƒณใซ็ฝฎใ„ใฆใใ ใ•ใ„ใ€‚ใ‚จใƒณใƒ†ใ‚ฃใƒ†ใ‚ฃใ‚’ๅค‰ๆ›ดใ—ใŸๅพŒใฏใ€build ใ‚’ๅฎŸ่กŒใ—ใ€diff ใ‚’็ขบ่ชใ—ใฆใ€migrations ใ‚’็”ŸๆˆใพใŸใฏๆ›ดๆ–ฐใ—ใพใ™ใ€‚

Value Object

Value Objectใฏใ€ใใฎๅฑžๆ€งใฎใฟใงๅฎš็พฉใ•ใ‚Œใ‚‹ใƒ‰ใƒกใ‚คใƒณใฎๆฆ‚ๅฟตใ‚’่กจใ—ใ€ๅ›บๆœ‰ใฎ่ญ˜ๅˆฅๅญใ‚’ๆŒใกใพใ›ใ‚“ใ€‚ใ™ในใฆใฎๅ€คใŒๅŒใ˜ๅ ดๅˆใ€ไบŒใคใฎValue Objectใฏ็ญ‰ใ—ใ„ใจ่ฆ‹ใชใ•ใ‚Œใพใ™ใ€‚

ไธปใช็‰นๅพด๏ผš

  • ไฝœๆˆๅพŒใฏไธๅค‰ใงใ™ใ€‚
  • Idใ‚’ๆŒใกใพใ›ใ‚“ใ€‚

Linoใง Value Object ใ‚’ไฝœๆˆใ™ใ‚‹

ๆฌกใ‚’ๅฎŸ่กŒใ—ใฆใใ ใ•ใ„๏ผš

lino value-object new

CLIใฏไปฅไธ‹ใ‚’ๅฐ‹ใญใพใ™๏ผš

  • ใ‚ตใƒผใƒ“ใ‚น โ€“ ใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใ‚’ไฝœๆˆใ™ใ‚‹ใ‚ตใƒผใƒ“ใ‚นใ€‚
  • ใƒขใ‚ธใƒฅใƒผใƒซ โ€“ ใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใ‚’ไฝœๆˆใ™ใ‚‹ใƒขใ‚ธใƒฅใƒผใƒซ๏ผˆใƒขใ‚ธใƒฅใƒผใƒซใ‚ตใƒผใƒ“ใ‚นใฎใฟ๏ผ‰ใ€‚
  • ๅ ดๆ‰€ โ€“ ใƒ‰ใƒกใ‚คใƒณใƒซใƒผใƒˆใพใŸใฏ็‰นๅฎšใฎใ‚ขใ‚ฐใƒชใ‚ฒใƒผใƒˆใ€‚
  • Value Object ใฎๅๅ‰ใ€‚

ๆฌกใซใ€ใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใ‚’ๆง‹ๆˆใ™ใ‚‹ใƒ•ใ‚ฃใƒผใƒซใƒ‰ใ‚’ๅฎš็พฉใ—ใพใ™ใ€‚

ๅˆฉ็”จๅฏ่ƒฝใชใƒ•ใ‚ฃใƒผใƒซใƒ‰ใ‚ฟใ‚คใƒ—

ใ‚ฟใ‚คใƒ—่ชฌๆ˜Žๅ‚™่€ƒ
short16ใƒ“ใƒƒใƒˆๆ•ดๆ•ฐ-32,768 โ†’ 32,767
int32ใƒ“ใƒƒใƒˆๆ•ดๆ•ฐ-2,147,483,648 โ†’ 2,147,483,647
long64ใƒ“ใƒƒใƒˆๆ•ดๆ•ฐ-9,223,372,036,854,775,808 โ†’ 9,223,372,036,854,775,807
stringใƒ†ใ‚ญใ‚นใƒˆ็ด„20ๅ„„ๆ–‡ๅญ—ใพใง
boolใƒ–ใƒผใƒซๅ€คtrue/false
decimalๆญฃ็ขบใชๅฐๆ•ฐ้‡‘้Šญ็š„ใชๅ€ค
floatๆตฎๅ‹•ๅฐๆ•ฐ็‚นๆ•ฐ (32ใƒ“ใƒƒใƒˆ)็ด„6๏ฝž9ๆก
doubleๆตฎๅ‹•ๅฐๆ•ฐ็‚นๆ•ฐ (64ใƒ“ใƒƒใƒˆ)็ด„15๏ฝž17ๆก
DateTimeๆ—ฅไป˜/ๆ™‚ๅˆปใ‚ฟใ‚คใƒ ใ‚พใƒผใƒณๅซใ‚€
DateOnlyๆ—ฅไป˜ใฎใฟC# 10ไปฅไธŠ
TimeOnlyๆ™‚ๅˆปใฎใฟC# 10ไปฅไธŠ

ไพ‹

Value Object Address:

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Property name โ”‚ Type   โ”‚ Length โ”‚ Required  โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Street        โ”‚ string โ”‚  100   โ”‚     x     โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Number        โ”‚ string โ”‚   10   โ”‚     x     โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Neighborhood  โ”‚ string โ”‚   50   โ”‚           โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ City          โ”‚ string โ”‚  100   โ”‚     x     โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ State         โ”‚ string โ”‚   2    โ”‚     x     โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ PostalCode    โ”‚ string โ”‚   20   โ”‚     x     โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Country       โ”‚ string โ”‚  100   โ”‚     x     โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

็”Ÿๆˆใ•ใ‚ŒใŸใƒ•ใ‚กใ‚คใƒซๆง‹้€ ๏ผˆใ‚ขใ‚ฐใƒชใ‚ฒใƒผใƒˆ Person๏ผ‰๏ผš

<ProjectName>/
โ””โ”€โ”€ src/
    โ””โ”€โ”€ Services/
        โ””โ”€โ”€ <ServiceName>/
            โ””โ”€โ”€ Domain/
                โ”œโ”€โ”€ <ProjectName>.<ServiceName>.Domain.csproj
                โ””โ”€โ”€ Aggregates/
                    โ””โ”€โ”€ People/
                        โ”œโ”€โ”€ Person.cs
                        โ”œโ”€โ”€ ValueObjects/
                        โ”‚   โ””โ”€โ”€ Address.cs
                        โ”œโ”€โ”€ Errors/
                        โ”‚   โ”œโ”€โ”€ AddressErrors.cs
                        โ”‚   โ””โ”€โ”€ PersonErrors.cs
                        โ”œโ”€โ”€ Repositories/
                        โ”‚   โ””โ”€โ”€ IPersonRepository.cs
                        โ””โ”€โ”€ Resources/
                            โ”œโ”€โ”€ Address/
                            โ”‚   โ”œโ”€โ”€ AddressResources.resx
                            โ”‚   โ”œโ”€โ”€ AddressResources.en.resx
                            โ”‚   โ””โ”€โ”€ AddressResources.pt-BR.resx
                            โ””โ”€โ”€ Person/
                                โ”œโ”€โ”€ PersonResources.resx
                                โ”œโ”€โ”€ PersonResources.en.resx
                                โ””โ”€โ”€ PersonResources.pt-BR.resx

ใ‚จใƒณใƒ†ใ‚ฃใƒ†ใ‚ฃใจๅŒๆง˜ใซใ€MigrationsใฏLinoใซใ‚ˆใฃใฆ็ฎก็†ใ•ใ‚Œใ€ใƒ‡ใƒผใ‚ฟใƒขใƒ‡ใƒซใฎๅŒๆœŸใ‚’็ถญๆŒใงใใพใ™ใ€‚

็พๅœจใฎ้€ฒๅŒ–ใƒฏใƒผใ‚ฏใƒ•ใƒญใƒผ

ๅฏพ่ฉฑๅž‹ใ‚ณใƒžใƒณใƒ‰ใซๅŠ ใˆใฆใ€ใใฎๆฆ‚ๅฟตใ‚’ใฉใ“ใซไฝœๆˆใ™ในใใ‹ๅˆ†ใ‹ใฃใฆใ„ใ‚‹ๅ ดๅˆใฏใƒ‘ใƒฉใƒกใƒผใ‚ฟใƒผใ‚’ไฝฟ็”จใ—ใพใ™๏ผš

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

ใ‚จใƒณใƒ†ใ‚ฃใƒ†ใ‚ฃใฎใƒ—ใƒญใƒ‘ใƒ†ใ‚ฃใŒ ValueObject ใจใ—ใฆๅฎฃ่จ€ใ•ใ‚Œใฆใ„ใ‚‹ๅ ดๅˆใ€Lino ใฏๆ—ขๅญ˜ใฎ Value Object ใ‚’ๅ†ๅˆฉ็”จใ™ใ‚‹ใ‹ใ€ใ‚จใƒณใƒ†ใ‚ฃใƒ†ใ‚ฃใƒขใƒ‡ใƒชใƒณใ‚ฐไธญใซๆ–ฐใ—ใ„ใ‚‚ใฎใ‚’ไฝœๆˆใงใใพใ™ใ€‚ใƒ•ใ‚ฃใƒผใƒซใƒ‰็พคใŒใŠ้‡‘ใ€ไฝๆ‰€ใ€ๅฏธๆณ•ใ€ๆœŸ้–“ใ€ใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆใฎใ‚ˆใ†ใชๅ˜ไธ€ใฎๆฆ‚ๅฟตใ‚’่กจใ™ๅ ดๅˆใฏใ€ใ“ใฎ้ธๆŠž่‚ขใ‚’ๅ„ชๅ…ˆใ—ใฆใใ ใ•ใ„ใ€‚

ๆฐธ็ถšๅŒ–ใ€UIใ€ใƒญใƒผใ‚ซใƒฉใ‚คใ‚ผใƒผใ‚ทใƒงใƒณ

Lino ใฏใƒขใ‚ธใƒฅใƒผใƒซใฎๆฐธ็ถšๅŒ–ใƒฌใ‚คใƒคใƒผใ‚’้€šใ˜ใฆ Value Objects ใฎใƒ—ใƒญใƒ‘ใƒ†ใ‚ฃใ‚’ใƒžใƒƒใƒ”ใƒณใ‚ฐใ—ใ€่กจ็คบใƒกใ‚ฟใƒ‡ใƒผใ‚ฟใ‚’ resources ใซๆธกใ—ใพใ™ใ€‚ใ“ใ‚Œใซใ‚ˆใ‚Šใ€ใƒใ‚นใƒˆใ•ใ‚ŒใŸๅ€คใซๅฏพใ—ใฆใƒญใƒผใ‚ซใƒฉใ‚คใ‚บใ•ใ‚ŒใŸ labels ใจใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’ๆไพ›ใงใใพใ™ใ€‚Value Object ใฏ็”Ÿๆˆใ•ใ‚ŒใŸใƒขใ‚ธใƒฅใƒผใƒซใซๅฑžใ—ใ€ๆ˜Ž็คบ็š„ใช integration ใŒใชใ„้™ใ‚Šใ€ใƒขใ‚ธใƒฅใƒผใƒซ้–“ใฎๅ…ฑๆœ‰ๅฅ‘็ด„ใซใฏใชใ‚Šใพใ›ใ‚“ใ€‚

invariants ใฏๅž‹ใใฎใ‚‚ใฎใงไฟ่ญทใ—ใฆใใ ใ•ใ„ใ€‚่ฒ ใฎๅ€คใ€็„กๅŠนใช้€š่ฒจใ€้€†่ปขใ—ใŸๆœŸ้–“ใ€ไธๆญฃใชๅฝขๅผใฎใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆใŒๆœ‰ๅŠนใชใ‚‚ใฎใจใ—ใฆ็”Ÿๆˆใ•ใ‚Œใฆใฏใ„ใ‘ใพใ›ใ‚“ใ€‚

ๅˆ—ๆŒ™ๅž‹

DDDใซใŠใ‘ใ‚‹ๅˆ—ๆŒ™ๅž‹ใฏใ€C#ใฎๅพ“ๆฅใฎenumใ‚’่ถ…ใˆใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚็Šถๆ…‹ใ‚’่กจใ™ใƒชใƒƒใƒใชใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใงใ‚ใ‚Šใ€ ใƒใƒชใƒ‡ใƒผใ‚ทใƒงใƒณใ‚„่ฃœๅŠฉใƒกใ‚ฝใƒƒใƒ‰ใ€ใ•ใ‚‰ใซใฏๆŒฏใ‚‹่ˆžใ„ใ‚’ๅซใ‚€ใ“ใจใŒๅฏ่ƒฝใงใ™ใ€‚

ๅ‹•ๆฉŸ๏ผš

  • C#ใฎenumใฏๆ•ดๆ•ฐใพใŸใฏๆ–‡ๅญ—ๅˆ—ใฎๅ€คใซ้™ๅฎšใ•ใ‚Œใฆใ„ใพใ™ใ€‚
  • ใ‚ฏใƒฉใ‚นใจใ—ใฆๅˆ—ๆŒ™ๅž‹ใ‚’ใƒขใƒ‡ใƒซๅŒ–ใ™ใ‚‹ใ“ใจใงใ€ใ‚ˆใ‚ŠๆŸ”่ปŸใง่กจ็พๅŠ›่ฑŠใ‹ใช่จญ่จˆใŒๅฏ่ƒฝใซใชใ‚Šใพใ™ใ€‚

ไธปใช็‰นๅพด๏ผš

  • ๅ…ฑ้€šใฎๅŸบๅบ•ใ‚ฏใƒฉใ‚นใ‚’็ถ™ๆ‰ฟใ—ใ€Idใจๅๅ‰ใ‚’ใ‚ซใƒ—ใ‚ปใƒซๅŒ–ใ—ใŸใ‚ฏใƒฉใ‚นใงใ™ใ€‚
  • ใƒใƒชใƒ‡ใƒผใ‚ทใƒงใƒณใ‚„่ฃœๅŠฉใƒกใ‚ฝใƒƒใƒ‰ใ€ๆŒฏใ‚‹่ˆžใ„ใ‚’่ฟฝๅŠ ใงใใพใ™ใ€‚

Linoใงๅˆ—ๆŒ™ๅž‹ใ‚’ไฝœๆˆใ™ใ‚‹

ไปฅไธ‹ใฎใ‚ณใƒžใƒณใƒ‰ใ‚’ๅฎŸ่กŒใ—ใฆใใ ใ•ใ„๏ผš

lino enumeration new

ใ‚ฆใ‚ฃใ‚ถใƒผใƒ‰ใงใฏไปฅไธ‹ใ‚’ๅฐ‹ใญใ‚‰ใ‚Œใพใ™๏ผš

  • ใ‚ตใƒผใƒ“ใ‚นใ€‚
  • ใƒขใ‚ธใƒฅใƒผใƒซ๏ผˆ่ฉฒๅฝ“ใ™ใ‚‹ๅ ดๅˆ๏ผ‰ใ€‚
  • ๅ ดๆ‰€ โ€” ใƒ‰ใƒกใ‚คใƒณใฎใƒซใƒผใƒˆใพใŸใฏใ‚ขใ‚ฐใƒชใ‚ฒใƒผใƒˆใ€‚
  • ๅˆ—ๆŒ™ๅž‹ใฎๅๅ‰ใ€‚
  • ใ‚ฟใ‚คใƒ— โ€” ๅพ“ๆฅใฎenumใ‹ใ‚นใƒžใƒผใƒˆ Enum๏ผˆclass๏ผ‰ใ€‚
  • ใƒ‡ใƒผใ‚ฟใƒ™ใƒผใ‚นใงใฎไฟๅญ˜ๆ–นๆณ• โ€” intใพใŸใฏstringใ€‚

ไพ‹

PersonStatusๅˆ—ๆŒ™ๅž‹๏ผš

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

็”Ÿๆˆใ•ใ‚ŒใŸๆง‹้€ ๏ผš

<ProjectName>/
โ””โ”€โ”€ src/
    โ””โ”€โ”€ Services/
        โ””โ”€โ”€ <ServiceName>/
            โ””โ”€โ”€ Domain/
                โ”œโ”€โ”€ <ProjectName>.<ServiceName>.Domain.csproj
                โ””โ”€โ”€ Aggregates/
                    โ””โ”€โ”€ People/
                        โ”œโ”€โ”€ Person.cs
                        โ”œโ”€โ”€ Enums/
                        โ”‚   โ””โ”€โ”€ PersonStatus.cs
                        โ”œโ”€โ”€ ValueObjects/
                        โ”‚   โ””โ”€โ”€ Address.cs
                        โ”œโ”€โ”€ Errors/
                        โ”‚   โ”œโ”€โ”€ AddressErrors.cs
                        โ”‚   โ””โ”€โ”€ PersonErrors.cs
                        โ”œโ”€โ”€ Repositories/
                        โ”‚   โ””โ”€โ”€ IPersonRepository.cs
                        โ””โ”€โ”€ Resources/
                            โ”œโ”€โ”€ Address/
                            โ”‚   โ”œโ”€โ”€ AddressResources.resx
                            โ”‚   โ”œโ”€โ”€ AddressResources.en.resx
                            โ”‚   โ””โ”€โ”€ AddressResources.pt-BR.resx
                            โ”œโ”€โ”€ Person/
                            โ”‚   โ”œโ”€โ”€ PersonResources.resx
                            โ”‚   โ”œโ”€โ”€ PersonResources.en.resx
                            โ”‚   โ””โ”€โ”€ PersonResources.pt-BR.resx
                            โ””โ”€โ”€ PersonStatus/
                                โ”œโ”€โ”€ PersonStatusResources.resx
                                โ”œโ”€โ”€ PersonStatusResources.en.resx
                                โ””โ”€โ”€ PersonStatusResources.pt-BR.resx

ๅˆ—ๆŒ™ๅž‹ใฎๅ€คใ‚’stringใจใ—ใฆไฟๅญ˜ใ™ใ‚‹ใ“ใจใ‚‚ๅฏ่ƒฝใงใ€ๅฏ่ชญๆ€งใŒๅ‘ไธŠใ—ใพใ™ใŒใ€ ใƒ‘ใƒ•ใ‚ฉใƒผใƒžใƒณใ‚นใ‚„ใ‚นใƒˆใƒฌใƒผใ‚ธๅŠน็އใงใฏๅŠฃใ‚‹ใ“ใจใŒใ‚ใ‚Šใพใ™ใ€‚ ใใฎใŸใ‚ใ€intใจใ—ใฆไฟๅญ˜ใ—ใ€ๆ•ดๅˆๆ€งใฎ็ถญๆŒใ‚„ไฟๅฎˆๆ€งๅ‘ไธŠใฎใŸใ‚ใซใ€ ๅˆ—ๆŒ™ๅž‹ใฎๅ€คใ‚’ไธปใ‚ญใƒผใจใ™ใ‚‹่ฃœๅŠฉ็š„ใชใ‚จใƒณใƒ†ใ‚ฃใƒ†ใ‚ฃ๏ผˆใƒ†ใƒผใƒ–ใƒซ๏ผ‰ใ‚’ไฝœๆˆใ™ใ‚‹ใ“ใจใ‚’ๆŽจๅฅจใ—ใพใ™ใ€‚

ๅˆ—ๆŒ™ๅž‹ใ‚’ๅฎš็พฉใ—ใŸๅพŒใฏใ€Linoใ‚’ไฝฟใฃใฆMigrationsใ‚’็”Ÿๆˆใƒป้ฉ็”จใ—ใ€ ใƒ‡ใƒผใ‚ฟใƒ™ใƒผใ‚นใŒใƒ‰ใƒกใ‚คใƒณใƒขใƒ‡ใƒซใ‚’ๅๆ˜ ใ™ใ‚‹ใ‚ˆใ†ใซใ—ใฆใใ ใ•ใ„ใ€‚ ่ฉณ็ดฐใฏๆฐธ็ถšๅŒ–ๅฑคใฎใ‚ปใ‚ฏใ‚ทใƒงใƒณใง่ชฌๆ˜Žใ—ใพใ™ใ€‚

็พๅœจใฎ้€ฒๅŒ–ใƒฏใƒผใ‚ฏใƒ•ใƒญใƒผ

ๅฏพ่ฉฑๅž‹ใ‚ณใƒžใƒณใƒ‰ใซๅŠ ใˆใฆใ€ๅ ดๆ‰€ใจๅๅ‰ใŒใ™ใงใซๅฎš็พฉใ•ใ‚Œใฆใ„ใ‚‹ๅ ดๅˆใฏใƒ‘ใƒฉใƒกใƒผใ‚ฟใƒผใ‚’ไฝฟ็”จใ—ใพใ™๏ผš

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

Enumerationใ€ใ‚จใƒณใƒ†ใ‚ฃใƒ†ใ‚ฃใ€ใพใŸใฏ่จญๅฎš

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

Enumeration ใŒ่กจ็คบๅใ‚’ๅ…ฌ้–‹ใ™ใ‚‹ๅ ดๅˆใ€Lino ใฏใƒญใƒผใ‚ซใƒฉใ‚คใ‚บใ•ใ‚ŒใŸ labels ็”จใฎ resources ใ‚’็”Ÿๆˆใงใใพใ™ใ€‚ๆฐธ็ถšๅŒ–ใ•ใ‚Œใ‚‹ๅ ดๅˆใ‚„ seed data ใจใ—ใฆไฝฟใ‚ใ‚Œใ‚‹ๅ ดๅˆใฏใ€ๅ€คใฎ่ฟฝๅŠ ใ€ๅ‰Š้™คใ€ๅๅ‰ๅค‰ๆ›ดใฎๅพŒใซ migrations ใ‚’็ขบ่ชใ—ใฆใใ ใ•ใ„ใ€‚ใ‚ณใƒผใƒ‰ใ€ใƒ‡ใƒผใ‚ฟใƒ™ใƒผใ‚นใ€UI ใฎๆ•ดๅˆๆ€งใ‚‚ใƒ‰ใƒกใ‚คใƒณๅค‰ๆ›ดใฎไธ€้ƒจใงใ™ใ€‚

処理されていないエラーが発生しました。 再読み込み ๐Ÿ—™