人ã
ã¯Javaçšã«æžãããå€ãæ¬ãã建ç¯ãåŠã³ãŸãã ãããã®æ¬ã¯åªããŠããŸãããåœæã®æ¥œåšã䜿çšããŠãåœæã®åé¡ã解決ããŠããŸãã æéã¯å€ãããCïŒã¯Javaããã軜ãScalaã«äŒŒãŠãããæ°ããåªããæ¬ã¯ã»ãšãã©ãããŸããã
ãã®èšäºã§ã¯ãè¯ãã³ãŒããšæªãã³ãŒãã®åºæºãæž¬å®æ¹æ³ãšæž¬å®å¯Ÿè±¡ã調ã¹ãŸãã å
žåçãªã¿ã¹ã¯ãšã¢ãããŒãã®æŠèŠãèŠãŠãé·æãšçæãåæããŸãã æåŸã«ãWebã¢ããªã±ãŒã·ã§ã³ãèšèšããããã®æšå¥šäºé
ãšãã¹ããã©ã¯ãã£ã¹ããããŸãã
ãã®èšäºã¯ãDotNext 2018ã¢ã¹ã¯ã¯äŒè°ããã®ç§ã®ã¬ããŒãã®è»¢åã§ãã ããã¹ãã«å ããŠããããªãšã«ããã®äžã®ã¹ã©ã€ããžã®ãªã³ã¯ããããŸãã

ãµã€ãã® ã¹ã©ã€ããšã¬ããŒãããŒãž ã
ç§ã«ã€ããŠç°¡åã«èª¬æãããšãç§ã¯ã«ã¶ã³åºèº«ã§ããã€ãã¯ã°ã«ãŒãã§åããŠããŸãã ç§ãã¡ã¯ããžãã¹åãã®ãœãããŠã§ã¢ãéçºããŠããŸãã æè¿ãç§ã¯äŒæ¥ãœãããŠã§ã¢éçºãšåŒã°ããã«ã¶ã³é£éŠå€§åŠã§ã³ãŒã¹ãæããŠããŸãã æã
ããšã³ãžãã¢ãªã³ã°ã®å®è·µããšã³ã¿ãŒãã©ã€ãºãœãããŠã§ã¢ã®éçºã«é¢ããHabrã«é¢ããèšäºãå·çããŠããŸãã
ãæ³åã®ãšããã仿¥ã¯ãšã³ã¿ãŒãã©ã€ãºãœãããŠã§ã¢ã®éçºãã€ãŸãææ°ã®Webã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯æ¹æ³ã«ã€ããŠèª¬æããŸãã
- åºæº
- å»ºç¯ææ³ã®çºå±ã®ç°¡åãªæŽå²ïŒäœããäœã«ãªããäœãåé¡ã«ãªã£ãã®ãïŒ;
- å€å
žçãªéå±€åã¢ãŒããã¯ãã£ã®æ¬ é¥ã®æŠèŠ
- 決å®
- 詳现ã«é£ã³èŸŒãããšãªãå®è£
ã®æ®µéçãªåæ
- çµæã
åºæº
åºæºãçå®ããŸãã ãã¶ã€ã³ã«ã€ããŠè©±ãã®ããç§ã®ã«ã³ããŒã¯ããªãã®ã«ã³ããŒãã匷ãããšããã¹ã¿ã€ã«ã®è©±ããããšããç§ã¯æ¬åœã«ããã奜ãã§ã¯ãããŸããã ããžãã¹ã«ã¯ãååãšããŠããéãšåŒã°ããç¹å®ã®åºæºããããŸãã æã¯éãªããšããããšã¯èª°ããç¥ã£ãŠããã®ã§ããããã®2ã€ã®ã³ã³ããŒãã³ããæãéèŠã§ãã

ã ãããåºæºã ååãšããŠãäŒæ¥ã¯ãåäœæéãããã§ããã ãå€ãã®æ©èœããèŠæ±ããããšãæãå€ããããŸããã1ã€ã®æ³šæäºé
ããããŸãããããã®æ©èœã¯æ©èœããã¯ãã§ãã ãããŠããããå£ããå¯èœæ§ã®ããæåã®ã¹ãããã¯ã³ãŒãã¬ãã¥ãŒã§ãã ã€ãŸããããã°ã©ããŒã¯ã3æé以å
ã«ããããšèšã£ãããã§ãã 3æéãçµéãããšãã¬ãã¥ãŒãã³ãŒãã«åæ ãããããŒã ãªãŒããŒã¯ããããããããããçŽããŠãã ããããšèšããŸããã ããã«3ã€ãããŸããã³ãŒãã¬ãã¥ãŒã§åæ ŒããååŸ©ã®æ°ã§ãã®ã§ã3æéãæããå¿
èŠããããŸãã
次ã®ãã€ã³ãã¯ãåãå
¥ããã¹ãã®æ®µéããã®æ»ãã§ãã åãããšã ãã®æ©èœãæ©èœããªãå Žåã¯ãæ©èœããŸããããããã®3æéã¯1é±éã2åé-ããããããšã§ãã æåŸã®åºæºã¯ãååž°ãšãã°ã®æ°ã§ãããããã§ããã¹ããšåãå
¥ãã«ãããããããå®çšŒåãçµãŸããã ãããéåžžã«æªãã§ãã ãã®åºæºã«ã¯1ã€ã®åé¡ããããŸãã ãªããžããªã«äœããããã·ã¥ãããšããäºå®ãšã2é±éåŸã«äœããå£ãããšããäºå®ãšã®é¢ä¿ã远跡ããã®ã¯é£ããããã远跡ããã®ã¯å°é£ã§ãã ãã ããããã§ãå¯èœã§ãã
ã¢ãŒããã¯ãã£éçº
ãããããããããã°ã©ããŒãããã°ã©ã ãæžãå§ããã°ããã ã£ããšãããŸã ã¢ãŒããã¯ãã£ã¯ãªãã誰ãã奜ããªããšããã¹ãŠãããŸããã

ãããã£ãŠãç§ãã¡ã¯ãã®ãããªå»ºç¯ã¹ã¿ã€ã«ãåŸãŸããã ããã§ã¯ãããŒãã«ã³ãŒãããšåŒã°ããæµ·å€ã§ã¯ãã¹ãã²ããã£ã³ãŒãããšèšããŸãã ãã¹ãŠããã¹ãŠãšçµã³ã€ããŠããŸãããã€ã³ãAã§äœããå€ããŠããŸã-ãã€ã³ãBã§å£ããŸããäœãäœãšçµã³ã€ããŠããã®ããçè§£ããããšã¯å®å
šã«äžå¯èœã§ãã åœç¶ãããã°ã©ãã¯ãããæ©èœããªãããšãããã«èªèããããã€ãã®æ§é ãäœæããå¿
èŠããããããã€ãã®ã¬ã€ã€ãŒã圹ç«ã€ãšå€æããŸããã ããŠããã³ã¹ããŒããã³ãŒãã§ãããã©ã¶ãã¢ããã®ãããªã¬ã€ã€ãŒã§ãããšæ³åãããªããããã«ã¬ã€ã€ãŒãã¢ãŒããã¯ãã£ã®å³ã瀺ããŸãã ã²ãèã¯çްããå»ãŸãããŸãŸã§ãããä»ã§ã¯ã¬ã€ã€ãŒ1ã®ã²ãèã¯ãããåã蟌ãã§ã¬ã€ã€ãŒ2ã®ã²ãèãšè©±ãããããšã¯ã§ããŸãããã³ãŒãã«äœããã®åœ¢ãäžããŸããïŒåçã§ãããç»å±±ãããæ çµãããŠããããšãããããŸãã

ãããã誰ãã
å€å
žçãªéå±€åã¢ãŒããã¯ãã£ã«ç²ŸéããŠããã§ããããUIãããžãã¹ããžãã¯ãããŒã¿ã¢ã¯ã»ã¹ã¬ã€ã€ããããŸãã äŒç€ŸãèŸãã建ç¯å®¶ã«ã¡ãªãã§åä»ããããããããçš®é¡ã®ãµãŒãã¹ããã¡ãµãŒããã¬ã€ã€ãŒããŸã ãããŸããããããã®æ°ã«å¶éã¯ãããŸããã

æ¬¡ã®æ®µéã¯ããããã
ã¿ããã®ã®ã¢ãŒããã¯ãã£ã§ããã 倧ããªéããããããã«æãããŸãããã®åã«å°ããªæ£æ¹åœ¢ããããããã«åããããŸããã ãŸã£ããéãããã§ãã

ããã§ããªãã å
šäœçãªéãã¯ããã®æç¹ã§SOLIDã®ååãå®åŒåãããããšã§ãããå€å
žçãªã¿ããã®ã§ã¯ãäœããã®çç±ã§æœè±¡ãã¡ã€ã³ã³ãŒããå®è£
ãããŒã¿ã¢ã¯ã»ã¹ã«äŸåãããããäŸåé¢ä¿ã®é転ã«åé¡ãããããšã倿ãããããããŒã¿ã¢ã¯ã»ã¹ãå±éããããšã«ããŸãããããã³ããŒã¿ã¢ã¯ã»ã¹ããã¡ã€ã³ã«äŸåããããã«ããŸãã

ããã§ç§ã¯ãããŒã€ã³ã°ãç·Žç¿ããã¿ããã®ã®ã¢ãŒããã¯ãã£ãæããŸããããå€å
žçãªããªã³ã°ãã§ã¯ãããŸããã å€è§åœ¢ãšåã®éã«äœããåŸãŸããã ããã¯ããã¿ããã®ãããå
è§åœ¢ãããŸãã¯ãããŒããšã¢ããã¿ãŒããšããèšèã«åºäŒã£ãå Žåãããããã¹ãŠåãã§ããããšã瀺ãããã ãã«è¡ããŸããã ãã€ã³ãã¯ããã¡ã€ã³ãäžå¿ã«ããããµãŒãã¹ã«ã©ãããããŠããããšã§ããå¿
èŠã«å¿ããŠããã¡ã€ã³ãŸãã¯ã¢ããªã±ãŒã·ã§ã³ãµãŒãã¹ã«ããããšãã§ããŸãã ãããŠãDALãç§»åããUIããã¹ããã€ã³ãã©ã¹ãã©ã¯ãã£ã®åœ¢ã®å€ã®äžç-圌ãã¯ãã®ãµãŒãã¹å±€ãéããŠãã¡ã€ã³ãšéä¿¡ããŸãã
ç°¡åãªäŸã ã¡ãŒã«æŽæ°
ãã®ãããªãã©ãã€ã ã§ããŠãŒã¶ãŒã®ã¡ãŒã«ã¢ãã¬ã¹ãæŽæ°ãããšããåçŽãªãŠãŒã¹ã±ãŒã¹ãã©ã®ããã«èŠããããèŠãŠã¿ãŸãããã

ãªã¯ãšã¹ããéä¿¡ããæ€èšŒããããŒã¿ããŒã¹ã®å€ãæŽæ°ããæ°ããã¡ãŒã«ã«éç¥ãéä¿¡ããå¿
èŠããããŸããããã¹ãŠãæ£åžžã§ãããã¡ãŒã«ã倿ŽããŸããããã¹ãŠåé¡ãããŸããããã200ããã©ãŠã¶ã«è¿ä¿¡ããŸãã

ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã ããã«ã¯ãæšæºã®
ASP.NET MVCæ€èšŒããããããŒã¿ãèªã¿åããæŽæ°ããORMããããéç¥ãéä¿¡ããäœããã®é»åã¡ãŒã«éä¿¡è
ãããŸãã ãã¹ãŠãè¯ãããã§ããã 1ã€ã®æ³šæç¹-çæ³çãªäžçã§ã
çŸå®ã®äžçã§ã¯ãç¶æ³ã¯ãããã«ç°ãªããŸãã ãã€ã³ãã¯ãæ¿èªããšã©ãŒãã§ãã¯ããã©ãŒãããããã°ãããã³ãããã¡ã€ãªã³ã°ã远å ããããšã§ãã ããã¯ãã¹ãŠããŠãŒã¹ã±ãŒã¹ãšã¯é¢ä¿ãããŸãããããã¹ãŠããã§ãªããã°ãªããŸããã ãããŠããã®å°ããªã³ãŒãã¯å€§ãããŠæããããã®ã«ãªããŸããããã¹ããå€ããã³ãŒããå€ããèªã¿åããé£ãããæãéèŠãªããšã¯ããã¡ã€ã³ã³ãŒããããã€ã³ãã©ã¹ãã©ã¯ãã£ã³ãŒãã®æ¹ãå€ããšããäºå®ã§ãã

ããµãŒãã¹ã¯ã©ãã§ããïŒããšããªãã¯èšããŸãã ãã¹ãŠã®ããžãã¯ãã³ã³ãããŒã©ãŒã«æžã蟌ã¿ãŸããã ãã¡ãããããã¯åé¡ã§ããä»ã¯ãµãŒãã¹ã远å ããŸããããã¹ãŠåé¡ãããŸããã

ãµãŒãã¹ã远å ãããšãæ¬åœã«è¯ããªããŸãã倧ããªè¶³åžã®ä»£ããã«ãå°ããªçŸããã©ã€ã³ã1ã€ããããã§ãã
è¯ããªã£ãŠããŸããïŒ ãªã£ãŠããŸãïŒ ãããŠããã®ã¡ãœãããç°ãªãã³ã³ãããŒã©ãŒã§åå©çšã§ããããã«ãªããŸããã çµæã¯æããã§ãã ãã®ã¡ãœããã®å®è£
ãèŠãŠã¿ãŸãããã

ããããããã§ã¯ãã¹ãŠãããã»ã©è¯ããããŸããã ãã®ã³ãŒãã¯ãŸã ããã«ãããŸãã ãã¹ãŠãåãããã«ãµãŒãã¹ã«ç§»ããŸããã åé¡ã解決ããã®ã§ã¯ãªããåã«ãããåœè£
ããŠå¥ã®å Žæã«è»¢éããããšã«ããŸããã 以äžã§ãã

ããã«å ããŠãããã€ãã®ä»ã®è³ªåãçºçããŸãã ã³ã³ãããŒã©ãŒãŸãã¯ããã§æ€èšŒãè¡ãå¿
èŠããããŸããïŒ ãŸããã³ã³ãããŒã©ãŒã®ãããªãã®ã§ãã ãŸããããŒã¿ããŒã¹ã«ã¢ã¯ã»ã¹ããŠããã®ãããªIDããããã©ããããŸãã¯ãã®ãããªé»åã¡ãŒã«ãæã€ä»ã®ãŠãŒã¶ãŒãããªãããšã確èªããå¿
èŠãããå Žåã¯ã©ãã§ããããã ããŒããããã§ã¯ãµãŒãã¹ã§ã ããããããã§ã®ãšã©ãŒåŠçã¯ïŒ ãã®ãšã©ãŒåŠçã¯ããããããã«ãããã³ã³ãããŒã©ãŒã®ãã©ãŠã¶ãŒã«å¿çãããšã©ãŒåŠçã§ãã SaveChangesã¡ãœããã¯ããµãŒãã¹å
ã«ãããŸããããããã³ã³ãããŒã©ãŒã«è»¢éããå¿
èŠããããŸããïŒ 1ã€ã®ãµãŒãã¹ãåŒã³åºãããå Žåããã®ãµãŒãã¹ãåŒã³åºãæ¹ãè«ççã§ãããã³ã³ãããŒã©ãŒå
ã«åŒã³åºãå¿
èŠã®ãã3ã€ã®ãµãŒãã¹ã¡ãœãããããå Žåããããã®ãµãŒãã¹ã®å€éšã§åŒã³åºããŠãã©ã³ã¶ã¯ã·ã§ã³ã1ã€ã«ãªãããã«ããå¿
èŠãããããã§ã ãããã®åå°ã¯ãããããã¬ã€ã€ãŒãåé¡ã解決ããªãããšã瀺åããŠããŸãã

ãããŠããã®èãã¯è€æ°ã®äººã«èµ·ãããŸããã Googleã䜿çšããå Žåããããã®ç«æŽŸãªå€«ã®ãã¡å°ãªããšã3人ãåãããšã«ã€ããŠæžããŠããŸãã äžããäžãžïŒ
ã·ã³ãã«ã€ã³ãžã§ã¯ã¿ãŒ IoCã³ã³ãããŒã®äœæè
ã§ããStephen .NET JunkieïŒæ®å¿µãªããã圌ã¯ã€ã³ã¿ãŒãããäžã®ã©ãã«ã衚瀺ãããªãããã圌ã®å§ãç¥ããŸããïŒã 次ã®ãžããŒã»ãã¬ãŒãã¯
AutoMapperã®èè
ã§ãã ãããŠãäžã«ããã®ã¯
ãæ¥œãã¿ãšå©çã®ããã«
FïŒã®èè
ã§ããScott Vlashinã§ãã

ããããã¹ãŠã®äººã
ã¯åãããšã«ã€ããŠè©±ããå±€ã«åºã¥ããŠã§ã¯ãªãããŠãŒã¹ã±ãŒã¹ãã€ãŸãããžãã¹ãç§ãã¡ã«æ±ããŠããèŠä»¶ã«åºã¥ããŠã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããšãææ¡ããŸãã ãããã£ãŠãCïŒã®ãŠãŒã¹ã±ãŒã¹ã¯ãIHandlerã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããŠæ±ºå®ã§ããŸãã å
¥åå€ããããåºåå€ãããããã®ãŠãŒã¹ã±ãŒã¹ãå®éã«å®è¡ããã¡ãœããèªäœããããŸãã

ãããŠããã®ã¡ãœããã®å
éšã«ã¯ããã¡ã€ã³ã¢ãã«ããŸãã¯èªã¿åãçšã®éæ£èŠåã¢ãã«ããããŸããäœããæ¢ãå¿
èŠãããå ŽåãDapperãŸãã¯Elastic Searchã䜿çšã§ããŸãã -ã¹ãã¢ãããã·ãŒãžã£ãåããã·ã¹ãã -åé¡ãªãããããã¯ãŒã¯èŠæ±ã-äžè¬ã«ãããã«å¿
èŠãªãã®ã¯ãã¹ãŠãããŸãã ããããã¬ã€ã€ãŒããªãå Žåã¯ã©ãããã°ããã§ããïŒ

éå§ããã«ã¯ãUserServiceãåé€ããŸãããã ã¡ãœãããåé€ããŠã¯ã©ã¹ãäœæããŸãã ãããŠåé€ããå床åé€ããŸãã ãããŠãã¯ã©ã¹ãååŸããŠåé€ããŸãã

èããŠã¿ãŸãããããããã®ã¯ã©ã¹ã¯åçã§ããïŒ GetUserã¯ã©ã¹ã¯ããŒã¿ãè¿ãããµãŒããŒäžã®äœã倿ŽããŸããã ããã¯ãããšãã°ããGive me the user IDããšãããªã¯ãšã¹ãã«é¢ãããã®ã§ãã UpdateEmailããã³BanUserã¯ã©ã¹ã¯ãæäœã®çµæãè¿ããç¶æ
ã倿ŽããŸãã ããšãã°ããµãŒããŒã«ãç¶æ
ã倿ŽããŠãã ãããäœãã倿Žããå¿
èŠããããŸãããšäŒããå Žåã

HTTPãããã³ã«ãèŠãŠã¿ãŸãããã HTTPãããã³ã«ã®ä»æ§ã«åŸã£ãŠããµãŒããŒã®ç¶æ
ã倿Žããã«ããŒã¿ãè¿ãGETã¡ãœããããããŸãã

ãŸãããµãŒããŒã®ç¶æ
ã倿Žããæäœã®çµæãè¿ãããšãã§ããä»ã®ã¡ãœããããããŸãã

CQRSãã©ãã€ã ã¯ãHTTPãããã³ã«çšã«ç¹å¥ã«èšèšãããŠããããã§ãã ã¯ãšãªã¯GETæäœã§ãããã³ãã³ãã¯PUTãPOSTãDELETEã§ããäœãçºæããå¿
èŠã¯ãããŸããã

ãã³ãã©ãåå®çŸ©ãã远å ã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®çŸ©ããŸãã IQueryHandlerã¯ãå
¥åå€ã®ã¿ã€ããIQueryã§ãããšããå¶çŽãæãããšããç¹ã§ã®ã¿ç°ãªããŸãã IQueryã¯ããŒã«ãŒã€ã³ã¿ãŒãã§ã€ã¹ã§ããããã®ãžã§ããªãã¯ã®ã¿ã§ãã QueryHandlerã«å¶çŽãèšå®ããã«ã¯ãžã§ããªãã¯ãå¿
èŠã§ããQueryHandlerã宣èšãããšãQueryã§ã¯ãªãQueryãªããžã§ã¯ããæž¡ãããšãã§ããŸãããQueryãªããžã§ã¯ããããã«æž¡ããšããã®æ»ãå€ãããããŸãã ããã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã1ã€ãããªãå Žåã«äŸ¿å©ã§ãããã®ãããã³ãŒãå
ã§å®è£
ãæ¢ãå¿
èŠããªãããŸãæ··ä¹±ããªãããã«ããå¿
èŠããããŸãã IQueryHandlerãèšè¿°ããããã§å®è£
ãèšè¿°ããŸããTOutã§ã¯ãå¥ã®ã¿ã€ãã®æ»ãå€ã«çœ®ãæããããšã¯ã§ããŸããã ã³ã³ãã€ã«ããŸããã ãããã£ãŠãã©ã®å
¥åå€ãã©ã®å
¥åããŒã¿ã«å¯Ÿå¿ããããããã«ç¢ºèªã§ããŸãã

CommandHandlerã®ç¶æ³ã¯1ã€äŸå€ããããŸããããã®ãžã§ããªãã¯ã¯ãã1ã€ã®ããªãã¯ã«å¿
èŠã§ããããã«ã€ããŠã¯ããå°ã詳ããèŠãŠãããŸãã
ãã³ãã©ãŒã®å®è£
ãã³ãã©ãŒãç§ãã¡ãçºè¡šããããããã®å®è£
ã¯äœã§ããïŒ

åé¡ã¯ãããŸããïŒ äœãã倱æããããã§ãã
ãã³ã¬ãŒã¿ã¯æå©ã«æ¥ããŸã
ããããããã¯åœ¹ã«ç«ããªãã£ãããŸã éã®çã£inäžã«ããã®ã§ãããå°ããã¡ã€ãã©ã€ãºããå¿
èŠããããä»åã¯
ãã³ã¬ãŒã¿ãŒãã¿ãŒã³ãã€ãŸããã®çŽ æŽãããã¬ã€ã¢ãŠãæ©èœã䜿çšããå¿
èŠãããã ãã³ã¬ãŒã¿ã¯ããã³ã¬ãŒã¿ã«å
ãŸãããããã³ã¬ãŒã¿ã«å
ãŸãããããã³ã¬ãŒã¿ã«å
ãŸãããããŸããéå±ãããŸã§ç¶ããŠãã ããã

次ã«ããã¹ãŠã次ã®ããã«ãªããŸããå
¥åDtoããããæåã®ãã³ã¬ãŒã¿ã2çªç®ã3çªç®ã«å
¥ãããã³ãã©ã«ç§»åããŠçµäºãããã¹ãŠã®ãã³ã¬ãŒã¿ãééããŠããã©ãŠã¶ã§Dtoãè¿ããŸãã åŸã§ç¶æ¿ããããã«æœè±¡åºæ¬ã¯ã©ã¹ã宣èšããHandlerã®æ¬äœãã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ãã远å ã®ãã³ã¬ãŒã¿ãŒããžãã¯ããã³ã°ããæœè±¡Handleã¡ãœããã宣èšããŸãã

ããã§ããã³ã¬ãŒã¿ã®å©ããåããŠããã€ãã©ã€ã³å
šäœãæ§ç¯ã§ããŸãã ããŒã ããå§ããŸãããã äœããã£ãã®ïŒ å
¥åå€ãæ€èšŒãã¢ã¯ã»ã¹å¶åŸ¡ãããžãã¯èªäœããã®ããžãã¯ã®çµæãšããŠçºçããããã€ãã®ã€ãã³ããããã³æ»ãå€ã

æ€èšŒããå§ããŸãããã ãã³ã¬ãŒã¿ã宣èšããŸãã ãããã®ãã¹ãŠãå®è¡ããæ€èšŒã倱æããæ»ãå€ã®åã
IEnumerable<validationresult>
ã§ãããã©ããã確èªããŠãããåãäžèŽããããè¿ãããšãã§ããŸãã ãããŠããããä»ã®ãã³ãã©ãŒã§ããå Žåã¯ãäŸå€ãã¹ããŒããå¿
èŠããããŸããããã«ã¯çµæããªããå¥ã®æ»ãå€ã®åããããŸãã

次ã®ã¹ãããã¯ã»ãã¥ãªãã£ã§ãã ãŸãããã³ã¬ãŒã¿ã宣èšããCheckPermissionã¡ãœãããäœæããŠæ€èšŒããŸãã çªç¶äœããããŸããããªãã£ãå Žåãããã ãã§ããç¶è¡ããŸããã ããã§ããã¹ãŠã®ãã§ãã¯ãå®äºãããã¹ãŠãæ£åžžã§ããããšã確èªããåŸãããžãã¯ãå®è¡ã§ããŸãã
ããžãã¯ã®å®è£
ã瀺ãåã«ãå°ãåã«ãã€ãŸãããã«æ¥ãå
¥åå€ããå§ããããšæããŸãã

ããŠããã®ãããªã¯ã©ã¹ãéžæãããšãã»ãšãã©ã®å Žåããã®ããã«ãªããŸãã å°ãªããšãç§ãæ¥åžžæ¥åã§ç®ã«ããã³ãŒãã

æ€èšŒãæ©èœããããã«ãæ€èšŒã®çš®é¡ã瀺ãããã€ãã®å±æ§ãããã«è¿œå ããŸãã ããã¯ããŒã¿æ§é ã®é¢ã§ã¯åœ¹ç«ã¡ãŸãããããŒã¿ããŒã¹ã®å€ããã§ãã¯ãããªã©ã®æ€èšŒã«ã¯åœ¹ç«ã¡ãŸããã ããã¯åãªãEmailAddressã§ãããããŒã¿ããŒã¹ã«ç§»åããããã«ãããã®å±æ§ãã©ã®ããã«äœ¿çšãããã確èªããæ¹æ³ãå Žæã¯æç¢ºã§ã¯ãããŸããã 屿§ã®ä»£ããã«ãç¹å¥ãªã¿ã€ãã«åãæ¿ãããšããã®åé¡ã¯è§£æ±ºããŸãã

int
ããªããã£ãã®ä»£ããã«ãintããŒãæã€ç¹å®ã®ãšã³ãã£ãã£ã§ãããžã§ããªãã¯ãæã€Idåã宣èšããŸãã ãããŠããã®ãšã³ãã£ãã£ãã³ã³ã¹ãã©ã¯ã¿ã«æž¡ããããã®IDãæž¡ããŸãããåæã«ãIdãååŸããŠè¿ãããšãã§ãã颿°ãæž¡ãå¿
èŠããããŸãã

é»åã¡ãŒã«ã§ãåãããšãè¡ããŸãã ãã¹ãŠãåãããã«èŠããããã«ããã¹ãŠã®ã¡ãŒã«ãæçµè¡ã«å€æããŸãã æ¬¡ã«ãEmail屿§ãååŸããASP.NETæ€èšŒãšã®äºææ§ã®ããã«éçãšããŠå®£èšããããã§ã¯åã«ãããåŒã³åºããŸãã ã€ãŸãããããå®è¡ã§ããŸãã ASP.NETã€ã³ãã©ã¹ãã©ã¯ãã£ã§ããããã¹ãŠããã£ããããã«ã¯ãã·ãªã¢ã«åãModelBindingããããã«å€æŽããå¿
èŠããããŸãã ããã«ã¯å€ãã®ã³ãŒãã¯ãããŸãããããã¯æ¯èŒçåçŽãªã®ã§ãããã§æ¢ãŸããŸããã

ãããã®å€æŽåŸãããªããã£ãåã§ã¯ãªããç¹æ®ãªåãããã«è¡šç€ºãããŸãïŒIdããã³Emailã ãããŠããããã®ModelBinderãšæŽæ°ããããã·ãªã¢ã©ã€ã¶ãæ©èœããåŸããããã®å€ãæ£ããããšã確å®ã«ç¥ãããšãã§ããŸãããã®ãããªå€ãããŒã¿ããŒã¹ã«ããããšãå«ãŸããŸãã ãäžå€åŒã

次ã«èª¬æãããã€ã³ãã¯ãã¯ã©ã¹å
ã®äžå€æ¡ä»¶ã®ç¶æ
ã§ããããã¯ãå€ãã®å Žåãã¯ã©ã¹ãå€ãã®ã²ãã¿ãŒã»ãã¿ãŒã®ã¿ãååšãã
è²§è¡ã¢ãã«ã䜿çšãããããã§ãã è€éãªããžãã¹ããžãã¯ãæ±ããããã³ãŒããèªå·±ææžåãããŠããããšãéèŠã§ãã 代ããã«ãORMã®ç©ºãšå
±ã«å®éã®ã³ã³ã¹ãã©ã¯ã¿ã宣èšããããšããå§ãããŸããã¢ããªã±ãŒã·ã§ã³ã³ãŒãå
ã®ããã°ã©ãããããåŒã³åºããªãããã«ä¿è·ãããŠãããšå®£èšã§ããŸãã ããã§ã¯ãããªããã£ãåã§ã¯ãªããé»åã¡ãŒã«åãæž¡ããŸããããã¯æ¢ã«æ£ããæ£ãããã®ã§ããnullã®å ŽåãäŸå€ãã¹ããŒããŸãã ããã€ãã®FodyãPostSharpã䜿çšã§ããŸãããCïŒ8ããŸããªãç»å ŽãããããNulläžå¯ã®åç
§åãååšãããããèšèªã§ã®ãµããŒããåŸ
ã€ããšããå§ãããŸãã æ¬¡ã®ç¬éãååãšå§ã倿Žãããå Žåãããããããããäžç·ã«å€æŽãããã®ã§ãããããäžç·ã«å€æŽããé©åãªãããªãã¯ã¡ãœãããå¿
èŠã§ãã

ãã®ãããªãã¯ã¡ãœããã§ã¯ããããã®è¡ã®é·ããããŒã¿ããŒã¹ã§äœ¿çšãããã®ãšäžèŽããããšã確èªããŸãã ãããŠãäœããééã£ãŠããå Žåãå®è¡ã忢ããŸãã ããã§ã¯ãåãããªãã¯ã䜿çšããŸãã ç¹å¥ãªå±æ§ã宣èšããã¢ããªã±ãŒã·ã§ã³ã³ãŒãã§åŒã³åºããŸãã

ããã«ããã®ãããªå±æ§ã¯Dtoã§åå©çšã§ããŸãã ããŠãååãšå§ã倿Žãããå Žåããã®ãããªå€æŽã³ãã³ãããããŸãã ããã«ç¹å¥ãªã³ã³ã¹ãã©ã¯ã¿ã远å ãã䟡å€ã¯ãããŸããïŒ ããã¯äŸ¡å€ãããããã§ãã ããã¯è¯ããªãã誰ããããã®å€ã倿Žãããããããå£ãããæ£ç¢ºã«ãªããŸãã

å®éã«ã¯ããã§ã¯ãããŸããã å®éãDtoã¯å®éã«ã¯ãªããžã§ã¯ãã§ã¯ãããŸããã ããã¯ãéã·ãªã¢ã«åãããããŒã¿ãæ ŒçŽããèŸæžã§ãã ã€ãŸãããªããžã§ã¯ãã®ãµããããããšã¯ãã¡ããã§ããã責任ã¯1ã€ã ãã§ããããã¯ãã·ãªã¢ã«åãšéã·ãªã¢ã«åã§ãã ãã®æ§é ã«å¯ŸåŠããããšãããšããã¶ã€ããŒãšModelBinderã®çºè¡šãéå§ããŸãããã®ãããªããšã¯éåžžã«é¢åã§ãæãéèŠãªããšã¯ãæ°ãããã¬ãŒã ã¯ãŒã¯ã®æ°ãããªãªãŒã¹ã§äžæããŸãã ããã¯ãã¹ãŠãããŒã¯ãµã€ã¢ã³ã«ããèšäº
ãããã°ã©ã ã®å¢çã¯ãªããžã§ã¯ãæåã§ã¯ãããŸãããã§ãã説æãããŠããŸããè峿·±ãå Žåã¯ãåœŒã®æçš¿ãèªãã»ããè¯ãã§ããããããã§è©³ãã説æãããŠããŸãã

ã€ãŸããããŒãã£ãªå€éšäžçããããå
¥åã«ãã§ãã¯ãå
¥ããã¯ãªãŒã³ãªã¢ãã«ã«å€æããŠããããã¹ãŠãã·ãªã¢ã«åããã©ãŠã¶ãããŒãã£ãªå€éšäžçã«æ»ããŸãã
ãã³ãã©ãŒ
ãããã®å€æŽããã¹ãŠè¡ãããåŸãHanderã¯ã©ã®ããã«è¡šç€ºãããŸããïŒ

ããã§ã¯ãèªã¿ãããããããã«2è¡ãæžããŸããããäžè¬çã«ã¯1è¡ã§æžãããšãã§ããŸãã åã·ã¹ãã ããããæ€èšŒããããããããŒã¿ã¯æ£ç¢ºã§ããã€ãŸããããŒã¿ã¯éçã³ã³ã¯ãªãŒãã§ãããå床ãã§ãã¯ããå¿
èŠã¯ãããŸããã ãã®ãããªãŠãŒã¶ãŒãååšãããã®ãããªå¿ããé»åã¡ãŒã«ãæã€ä»ã®ãŠãŒã¶ãŒã¯ããŸããããã¹ãŠãè¡ãããšãã§ããŸãã ãã ããSaveChangesã¡ãœãããžã®åŒã³åºãã¯ãªããéç¥ããããŸãããããã°ãšãããã¡ã€ã©ãŒããããŸããããïŒ å
ã«é²ã¿ãŸãã
ã€ãã³ã
ãã¡ã€ã³ã€ãã³ãã

ããããããã®æŠå¿µãåœŒã®æçš¿
ããã¡ã€ã³ã€ãã³ã-æããã§ãŠãã£ããã³ã«ãã£ãŠåºãŸã£ãã®ã¯åããŠã§ãããã ããã§åœŒã¯ãRaiseã¡ãœããã䜿çšããŠéçã¯ã©ã¹ã宣èšãããã®ãããªã€ãã³ããã¹ããŒããããšãææ¡ããŠããŸãã å°ãåŸã«ããžããŒãã¬ãŒãã¯
ãA better domain events patternããšåŒã°ããããè¯ãå®è£
ãææ¡ããŸããã

Bogardã®ã·ãªã¢ã«åã1ã€ã®å°ããªå€æŽã§ç€ºããŸãããéèŠã§ãã ã€ãã³ããã¹ããŒãã代ããã«ããªã¹ãã宣èšã§ããŸãããŸããäœããã®åå¿ãçºçããå Žæã§ããããã®ã€ãã³ããä¿åãããšã³ãã£ãã£å
ã§çŽæ¥å®£èšã§ããŸãã ãã®å Žåããã®
email
getterã¯Userã¯ã©ã¹ã§ãããããã®ã¯ã©ã¹ã¯ãã®ããããã£ãgetterããã³setterãæã€ããããã£ã®ãµããããã®ã§ã¯ãªããå®éã«ããã«äœãã远å ããŸãã ã€ãŸããããã¯åencapsulationã§ã¯ãªããå®éã®ã«ãã»ã«åã§ãã 倿Žãããšããé»åã¡ãŒã«ãç°ãªãããšã確èªããã€ãã³ããã¹ããŒããŸãã ãã®ã€ãã³ãã¯ãŸã ã©ãã«ãå°éããŠãããããšã³ãã£ãã£ã®å
éšãªã¹ãã«ã®ã¿å«ãŸããŠããŸãã

ããã«ãSaveChangesã¡ãœãããåŒã³åºãæç¹ã§ãChangeTrackerã䜿çšãããã¡ã€ã³ã€ãã³ãããããã©ããã«ããããããã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ãããšã³ãã£ãã£ããããã©ããã確èªããŸãã ãããŠãããããã°ãããããã¹ãŠã®ãã¡ã€ã³ã€ãã³ããååŸããããããã©ãåŠçããããç¥ã£ãŠãããã£ã¹ãããã£ã«éä¿¡ããŸãããã
ãã®ãã£ã¹ãããã£ã®å®è£
ã¯å¥ã®è°è«ã®ãããã¯ã§ãããCïŒã§ã®è€æ°ã®ãã£ã¹ãããã«ã¯ããã€ãã®å°é£ããããŸããããããè¡ãããŠããŸãã ãã®ã¢ãããŒãã«ã¯ãå¥ã®éèªæãªå©ç¹ããããŸãã 2人ã®éçºè
ãããå Žåã1人ã¯ãã®é»åã¡ãŒã«ã倿Žããã³ãŒããèšè¿°ã§ãããã1人ã¯éç¥ã¢ãžã¥ãŒã«ãäœæã§ããŸãã ãããã¯çµ¶å¯Ÿã«çžäºã«æ¥ç¶ãããŠããããç°ãªãã³ãŒããèšè¿°ãã1ã€ã®Dtoã¯ã©ã¹ã®ãã®ãã¡ã€ã³ã€ãã³ãã®ã¬ãã«ã§ã®ã¿æ¥ç¶ãããŠããŸãã æåã®éçºè
ã¯ããæç¹ã§ãã®ã¯ã©ã¹ãåã«ç Žæ£ãã2çªç®ã®éçºè
ã¯ããã«åå¿ããéåžžçºçãããŠãŒã¶ãŒèšå®ãèæ
®ããŠãé»åã¡ãŒã«ãSMSãé»è©±ãžã®ããã·ã¥éç¥ãããã³ãã®ä»ãã¹ãŠã®100äžä»¶ã®éç¥ã§éä¿¡ããå¿
èŠãããããšãèªèããŠããŸãã

ãããæå°ã§ããéèŠãªãã€ã³ãã§ãã Jimmyã®èšäºã§ã¯SaveChangesã¡ãœããã®ãªãŒããŒããŒãã䜿çšããŠããŸãããããããªãã®ãæåã§ãã ãŸããSaveChangesã¡ãœããããªãŒããŒããŒãããHandlerã«dbContextãå¿
èŠãªå Žåã¯ã埪ç°äŸåé¢ä¿ãååŸããããããã³ã¬ãŒã¿ãŒã§å®è¡ããæ¹ãé©åã§ãã ããã§äœæ¥ã§ããŸããããœãªã¥ãŒã·ã§ã³ã¯å°ã䟿å©ã§ãªããå°ãçŸãããããŸããã ãããã£ãŠããã€ãã©ã€ã³ããã³ã¬ãŒã¿äžã«æ§ç¯ãããŠããå Žåããããå¥ã«è¡ãçç±ã¯ãããŸããã
ãã®ã³ã°ãšãããã¡ã€ãªã³ã°

ã³ãŒãã®ãã¹ãã¯æ®ããŸããããæåã®äŸã§ã¯ãæåã«MiniProfilerã䜿çšããæ¬¡ã«catchã詊ããæ¬¡ã«ifã詊ããŸããã åèšã§3ã€ã®ã¬ãã«ã®ãã¹ãããããŸãããããã®ã¬ãã«ã®ãã¹ãã¯ããããç¬èªã®ãã³ã¬ãŒã¿ãŒã«ãããŸãã ãããŠããããã¡ã€ãªã³ã°ãæ
åœãããã³ã¬ãŒã¿ãŒã®å
éšã«ã¯ããã¹ãã®ã¬ãã«ã1ã€ãããªããããã³ãŒãã¯å®å
šã«èªã¿åãããŸãã ããã«ããããã®ãã³ã¬ãŒã¿ãŒã«ã¯1ã€ã®è²¬ä»»ãããªãããšã¯æããã§ãã ãã³ã¬ãŒã¿ããã®ã³ã°ãæ
åœããŠããå Žåããããã¡ã€ãªã³ã°ã®å Žåããããã¡ã€ã«ã®ã¿ã®å Žåãä»ã®ãã¹ãŠãä»ã®å Žæã«ããå Žåã«ã®ã¿ãã°ã«èšé²ããŸãã
å¿ç
ãã€ãã©ã€ã³å
šäœãæ©èœããåŸãDtoãååŸããŠãã©ãŠã¶ãŒã«ããã«éä¿¡ããJSONãã·ãªã¢ã«åããããšããã§ããŸããã

ãããããã1ã€å°ããªããšããããŸãããã®ãããªããšã¯æã
å¿ããããŸãããã¹ãŠã®æ®µéã§äŸå€ãçºçããå¯èœæ§ããããå®éã«ã¯äœããã®æ¹æ³ã§ããããåŠçããå¿
èŠããããŸãã

Scott VlashinãšåœŒã®ã¬ããŒã
ãééæåããã°ã©ãã³ã°ãã«åã³èšåãããããããŸããã ãªãã§ïŒ å
ã®ã¬ããŒãã¯ãFïŒèšèªã§ã®ãšã©ãŒã®åŠçããããŒããããã«ç°ãªãæ¹æ³ã§æŽçããæ¹æ³ãããã³Exception'ovã䜿çšããããããã®ãããªã¢ãããŒããæãŸããçç±ãå®å
šã«æ±ã£ãŠããŸãã FïŒã§ã¯é¢æ°åèšèªã§ãããã¹ã³ããã¯é¢æ°åèšèªã®æ©èœã䜿çšãããããããã¯éåžžã«ããŸãæ©èœããŸãã

ãããããã»ãšãã©ã®äººã¯ãŸã CïŒã§ââæžããŠããã®ã§ãCïŒã§
ã¢ããã°ãæžããš
ããã®ã¢ãããŒãã¯æ¬¡ã®ããã«ãªããŸãã äŸå€ãã¹ããŒãã代ããã«ãæåãããã©ã³ããšå€±æãããã©ã³ããæã€ã¯ã©ã¹Resultã宣èšããŸãã ãããã£ãŠã2人ã®ãã¶ã€ããŒã ã¯ã©ã¹ã¯1ã€ã®ç¶æ
ã®ã¿ã«ãªããŸãã ãã®ã¯ã©ã¹ã¯ããŠããªã³åã®ç¹æ®ãªã±ãŒã¹ã§ãããFïŒããèå¥ããããŠããªã³ã§ãããCïŒã«ã¯çµã¿èŸŒãŸããŠããªããããCïŒã§æžãçŽãããŸãã

ã³ãŒãå
ã§èª°ããnullããã§ãã¯ããªãå¯èœæ§ãããããšããããªãã¯getterã宣èšãã代ããã«ããã¿ãŒã³ãããã³ã°ã䜿çšãããŸãã ç¹°ãè¿ãã«ãªããŸãããFïŒã§ã¯çµã¿èŸŒã¿ã®ãã¿ãŒã³ãããã³ã°èšèªã«ãªããŸããCïŒã§ã¯ãæäœã®æåçµæãã©ãåŠçãããããã§ãŒã³ãããã«äžã«å€æããæ¹æ³ãããã³ãšã©ãŒã®ãã颿°ã1ã€ã®é¢æ°ã«æž¡ãå¥ã®ã¡ãœãããèšè¿°ããå¿
èŠããããŸãã ã€ãŸããã©ã®ãã©ã³ããæ©èœããŠãããã«é¢ä¿ãªããããã1ã€ã®è¿ãããçµæã«ãã£ã¹ãããå¿
èŠããããŸãã FïŒã§ã¯ãããã¯éåžžã«ããŸãæ©èœããŸããããã¯ãæ©èœçãªæ§æãååšããããã§ãã .NETã§ã¯ãè€æ°ã®çµæãåŸããããšããã«ããã¯å°ãæªããªããŸãããå€ãã®-ãããŠã»ãšãã©ãã¹ãŠã®ã¡ãœãããäœããã®çç±ã§å€±æããå¯èœæ§ããããŸã-çµæã®é¢æ°åã®ã»ãšãã©ãã¹ãŠãçµæåã«ãªããããããå¿
èŠãšããŸãäœããçµã¿åãããããã«ã

ããããçµã¿åãããæãç°¡åãªæ¹æ³ã¯
LINQã
䜿çšããããšã§ããå®éãLINQã¯IEnumerableã ãã§ãªããSelectManyã¡ãœãããšSelectã¡ãœãããæ£ããæ¹æ³ã§åå®çŸ©ãããšãCïŒã³ã³ãã€ã©ãŒã¯ãããã®åã«LINQæ§æã䜿çšã§ããããšãããããŸãã äžè¬ã«ãHaskell do-notationã䜿çšãããã¬ãŒã·ã³ã°ããŒããŒããFïŒã®åãèšç®åŒã䜿çšãããã¬ãŒã·ã³ã°ããŒããŒãäœæãããŸãã ããã¯ã©ã®ããã«èªãã¹ãã§ããïŒ ããã«ãæäœã®3ã€ã®çµæããããŸãã3ã€ãã¹ãŠã®ã±ãŒã¹ã§åé¡ããªããã°ããããã®çµær1 + r2 + r3ãååŸããŠè¿œå ããŸãã çµæã®å€ã®ã¿ã€ããResultã«ãªããŸãããSelectã§å®£èšããæ°ããResultã§ãã äžè¬ã«ãããã¯1ã€ã§ã¯ãªãã«ããŠããæå¹ãªã¢ãããŒãã§ãã

ä»ã®ãã¹ãŠã®éçºè
ã«ãšã£ãŠãCïŒã§ãã®ãããªã³ãŒããæžãå§ãããšããã«ããã®ãããªãã®ã«èŠãå§ããŸãã ããããã¯ã²ã©ãæãããäŸå€ã§ããæžããŠã¯ãããŸããïŒ åœŒãã¯æªã§ãïŒ èª°ãçè§£ã§ããããããã°ã§ããªãã³ãŒããæžãæ¹ãè¯ãã§ãããïŒã

CïŒã¯FïŒã§ã¯ãªãããããã«ç°ãªãããããè¡ãããŠããããšã«åºã¥ããŠç°ãªãæŠå¿µã¯ãããŸããããããŠããã¯ããŠããã®ããã«å°çäžã«åŒã£åŒµãããšãããšãããã¯ç©ããã§çããããšã«ãªããŸãã

代ããã«ãææžåããã誰ããç¥ã£ãŠãããéçºè
ã®éã§èªç¥çäžååãåŒãèµ·ãããªã
çµã¿èŸŒã¿ã®éåžžã®ããŒã«ã䜿çšã§ããŸãã ASP.NETã«ã¯ã°ããŒãã«ãªãã³ãã©ãŒäŸå€ããããŸãã

æ€èšŒã«åé¡ãããå Žåã¯ãã³ãŒã400ãŸãã¯422ïŒåŠçäžèœãªãšã³ãã£ãã£ïŒãè¿ãå¿
èŠãããããšãç¥ã£ãŠããŸãã èªèšŒãšèš±å¯ã«åé¡ãããå Žåã401ãš403ããããŸããäœããããŸããããªãã£ãå ŽåãäœããããŸããããŸããã§ããã ãããŠãäœããããŸããããããŠãŒã¶ãŒã«æ£ç¢ºã«äœãäŒãããã®ããããªãã®äŸå€ã¿ã€ããå®çŸ©ãããããIHasUserMessageã§ãããšèšã£ãŠããã®ã€ã³ã¿ãŒãã§ãŒã¹ã§Messageã²ãã¿ãŒã宣èšãããã§ãã¯ããŸãïŒãã®ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ãããŠããå Žåãã¡ãã»ãŒãžãåãåãããšãã§ããŸãäŸå€ããJSONã§ãŠãŒã¶ãŒã«æž¡ããŸãã ãã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ãããŠããªãå Žåã¯ãäœããã®ã·ã¹ãã ãšã©ãŒãçºçããŸãããŠãŒã¶ãŒã«äœãåé¡ãçºçããããšãäŒããã ãã§ãæ¢ã«ãããè¡ã£ãŠããŸãã
ã¯ãšãªãã€ãã©ã€ã³
ããŒã ã§ãããçµäºããRead-stackã®å
容ã確èªããŸãã ãªã¯ãšã¹ããæ€èšŒãã¬ã¹ãã³ã¹èªäœã«ã€ããŠã¯ãã»ãŒåãã§ããåå¥ã«åæ¢ããããšã¯ãããŸããã ããã«ã¯è¿œå ã®ãã£ãã·ã¥ããããããããŸããããäžè¬çã«ãã£ãã·ã¥ã«ã倧ããªåé¡ã¯ãããŸããã
ã»ãã¥ãªãã£
ã»ãã¥ãªãã£ãã§ãã¯ãèŠãŠã¿ãŸãããã ãã®ãªã¯ãšã¹ããè¡ãããšãã§ãããã©ããããã§ãã¯ããåãã»ãã¥ãªãã£ãã³ã¬ãŒã¿ãååšããå ŽåããããŸãã

ãã ããè€æ°ã®ã¬ã³ãŒãã衚瀺ãããªã¹ãã衚瀺ããå¥ã®ã±ãŒã¹ããããŸããäžéšã®ãŠãŒã¶ãŒã«ã¯å®å
šãªãªã¹ãã衚瀺ããå¿
èŠãããïŒããšãã°ãäžéšã®ã¹ãŒããŒç®¡çè
ïŒãä»ã®ãŠãŒã¶ãŒã«ã¯å¶éä»ããªã¹ãã衚瀺ããå¿
èŠããããŸãã , , , , , .
åé¡ã¯éåžžã«ç°¡åã«è§£æ±ºãããŸã . (IPermissionFilter), queryable queryable. , queryable, , where, : « , âŠÂ» â , permission'. , , permission', , permissionFilter' , . permission', , . queryable dbContext, . permissionFilter' , permissionFilter' . permissionFilter, , .

ORM, , Global Filters entity-? , context -.
Query Pipeline. Read Model
. CQRS , Dto, .

C#, , , LINQ, - , , , , . LinqQueryHandler'. constraint : Query, , . - , Dto .

Handle , . , TQuery . , queryable extension AutoMapper'. - , AutoMapper LINQ, , Select, .
, . , DotNext, ,
, , , , expression' , .
SQL
å
ã«é²ã¿ãŸãã , DotNext', â SQL. Select , , , queryable- .

, . , Title, Title , . , . SubTitle, , , - , queryable- . , .
, . , , . , , . «JsonIgnore», . , , Dto. , , . JSON, , Created LastUpdated , SubTitle â , . , , , , , . , - .

. , -, , . , pipeline, . â , , . , SaveChanges, Query SaveChanges. , , , NuGet, .
. , - , , . , , , , , â . , , : « », â . .
, ?

- . .

, , , . MediatR , . , , â , MediatR pipeline behaviour. , Request/Response, RequestHandler' . Simple Injector, â .

, , , , TIn: ICommand.

Simple Injector' constraint' . , , , constraint', Handler', constraint. , constraint ICommand, SaveChanges constraint' ICommand, Simple Injector , constraint' , Handler'. , , , .
? Simple Injector MeriatR â , , Autofac', -, , , . , .
,
, «».

, «Clean architecture». .

- - , MVC, , .

, , , Angular, , , , . , : « â MVC-», : « Features, : , Blog - Import, - ».
, , , , MVC-, , - , . MVC . , , â . .


- , - -, .
-, , . , . , - , User Service, pull request', , User Service , . , - , - , . - , .
. , . , , , . , , , , , , , - . , ( , ), , «Delete»: , , . ããªãå¿«é©ã§ãã
â «», , , , . , : , , , . , . , , . , , .
: . « », : , , . , , , , , , , . , . , - pull request , â , â - , . VCS : - , ? , - , , .

, , , . : . , . , , , , . , , , . , , . « », , . , , â , , .
: , - , . . - , , , , . - , - , , , , . .

ãŸãšããŸãã , IHandler . .
IHandler ICommandHandler IQueryHandler , . , , . , CommandHandler, CommandHandler', .
ãªããã , Query , Query â . , , , Hander, CommandHandler QueryHandler, - use case, .
â , , , , : , .
, . , . , -.
C# 8, nullable reference type . , , , , .
ChangeTracker' ORM.
Exception' â , F#, C#. , - , - , . , , Exception', , LINQ, , , , , , Dapper - , , , .NET.
, LINQ, , permission' â . , , - , , . , â .
. ãªã³ã¯ã¯æ¬¡ã®ãšããã§ãã
- Vertical Slices
- Domain Events
- DDD
- ROP
- LINQ Expressions:
- ããããªå»ºç¯

â . . â «Domain Modeling Made Functional», F#, F#, , , , , . C# , , Exception'.
, , â «Entity Framework Core In Action». , Entity Framework, , DDD ORM, , ORM DDD .
åºåã®åã 15-16 2019 .NET- DotNext Piter, . , .