ãšãŽã¡ã³ã¹ã¯è¯ãã¢ã€ãã¢ã§
è¯ãæ¬ãæžããŸããã ãããããããã®ã¢ã€ãã¢ã«ã¯æ¹æ³è«çæ ¹æ ããããŸããã çµéšè±å¯ãªéçºè
ãšã¢ãŒããã¯ãã¯ã顧客ã®å¯Ÿè±¡é åã«ã§ããã ãè¿ã¥ããå¿
èŠãããããšã顧客ãšè©±ãå¿
èŠãããããšãçŽæçã«ç解ããŠããŸãã ãããããŠããã¿ã¹èšèªãšé¡§å®¢ã®å®éã®èšèªã®ã³ã³ãã©ã€ã¢ã³ã¹ã«ã€ããŠãããžã§ã¯ããè©äŸ¡ããæ¹æ³ãæ確ã§ã¯ãããŸãããïŒ ãã¡ã€ã³ãå¢çä»ãã³ã³ããã¹ãã«æ£ããåå²ãããŠããããšãã©ã®ããã«ç解ããã®ã§ããïŒ ãããžã§ã¯ãã§DDDã䜿çšãããŠãããã©ããã確èªããæ¹æ³
æåŸã®ç¹ã¯ç¹ã«éèŠã§ãã 圌ã®ã¹ããŒãã®1ã€ã§ãã°ã¬ãã°ã€ã³ã°ã¯DDDãå®è·µããŠãã人ã
ã®æãäžããããã«æ±ããŸããã ãããŠã圌ã¯ãäžé£ã®ãããªãã¯ã²ãã¿ãŒãšã»ãã¿ãŒã§ã¯ã©ã¹ãäœæããããµãŒãã¹ããšããã«ããŒãã®ããžãã¯ãæã¡ããããDDDãšåŒã¶äººãé€å€ããããã«èŠæ±ããŸããã ããŒã«ã«ããããç¬ãããããŸãã:)
DDDã¹ã¿ã€ã«ã§ããžãã¹ããžãã¯ãæ§æããæ¹æ³ ãåäœããä¿åããå ŽæïŒãµãŒãã¹ããšã³ãã£ãã£ãæ¡åŒµã¡ãœããããŸãã¯ã©ãã§ãå°ãã§ããïŒ ãã®èšäºã§ã¯ããµããžã§ã¯ãé åã®èšèšæ¹æ³ãšäœ¿çšããã«ãŒã«ã«ã€ããŠèª¬æããŸãã
ãã¹ãŠã®äººããããã€ã
ãã¡ãããå
·äœçã«ã¯ãããŸãã:)å®éã«ã¯ãããžãã¹ã¢ããªã±ãŒã·ã§ã³ã¯å¹
åºãã¿ã¹ã¯çšã«äœæãããããŸããŸãªãŠãŒã¶ãŒã°ã«ãŒãã®é¢å¿ãæºãããŸãã ãããããæåããæåŸãŸã§ããžãã¹ããã»ã¹ãç解ã§ããã®ã¯ããããããžã¡ã³ãã ãã§ãã ã¡ãªã¿ã«ããŸãã«èª€è§£ããªãã§ãã ããã åºç»å
ã§ã¯ãäžéšã®ã¿ã衚瀺ãããŸãã ãããã£ãŠããã¹ãŠã®å©å®³é¢ä¿è
ãžã®ã€ã³ã¿ãã¥ãŒã®çµæã¯éåžžãççŸã®ãã€ãã«ãªããŸãã ãã®èŠåãã次ã®ããšãããããŸãã
æåã«ãåæã次ã«èšèšããããŠãããã-éçº
ããŒã¿ããŒã¹æ§é ãŸãã¯ã¯ã©ã¹ã®ã»ããã§ã¯ãªããããžãã¹ããã»ã¹ããéå§ããå¿
èŠããããŸãã BPMNãšUMLã¢ã¯ãã£ããã£ã
ãã¹ãã±ãŒã¹ãšçµã¿åãããŠäœ¿çšââããŸãã ãã£ãŒãã¯ãèŠæ Œã«ç²ŸéããŠããªã人ã§ãããèªãŸããŸãã 衚圢åŒã®ãã¹ãã±ãŒã¹ã¯ãå¢çã±ãŒã¹ãããé©åã«èå¥ããççŸãæé€ããã®ã«åœ¹ç«ã¡ãŸãã
ã¢ãã¹ãã©ã¯ãããŒã¯ã¯æéã®ç¡é§ã§ãã 人ã
ã¯è©³çŽ°ã¯éèŠã§ã¯ãªããããã¹ãŠããã§ã«æ確ã§ãããããããããè°è«ããå¿
èŠã¯ãŸã£ãããªãããšç¢ºä¿¡ããŠããŸãã ãã¹ãã±ãŒã¹ã®è¡šã«èšå
¥ãããªã¯ãšã¹ãã¯ããªãã·ã§ã³ãå®éã«ã¯3ã§ã¯ãªã26ã§ããããšãæ確ã«ç€ºããŠããŸãïŒããã¯èªåŒµã§ã¯ãªãããããžã§ã¯ãã®1ã€ã§ã®åæã®çµæã§ãïŒã
è¡šãšã°ã©ãã¯ãããžãã¹ãåæãéçºã®éã®äž»èŠãªã³ãã¥ãã±ãŒã·ã§ã³ããŒã«ã§ãã BPMNãã€ã¢ã°ã©ã ãšãã¹ãã±ãŒã¹ã®ããŒãã«ã®ã³ã³ãã€ã«ãšäžŠè¡ããŠã
ãããžã§ã¯ãã®ã·ãœãŒã©ã¹ã«çšèªãæžãå§ããŸãã èŸæžã¯ãåŸã§ãšã³ãã£ãã£ã®èšèšã«åœ¹ç«ã¡ãŸãã
ã³ã³ããã¹ããéžæ
çµç¹å
šäœã§åäžã®äžè²«ããèšèªã䜿çšããããªã·ãŒãããã管çã¬ãã«ã§æ¡çšããã³å®è£
ãããŠããå Žåã«ã®ã¿ãã¢ããªã±ãŒã·ã§ã³å
šäœã®åäžã®ãµããžã§ã¯ãã¢ãã«ãäœæã§ããŸãã ããªãã¡ å¶æ¥éšéãå¶äœã«ãã¢ã«ãŠã³ãããšèšããšãäž¡è
ã¯åãèšèãç解ããŸãã ããã¯åäžã®ã¢ã«ãŠã³ãã§ããããCRMã¢ã«ãŠã³ããããã¯ã©ã€ã¢ã³ãã®æ³äººãã§ã¯ãããŸããã
å®ç掻ã§ã¯ãç§ã¯ãããèŠãããšããªãã ãããã£ãŠã察象ã¢ãã«ãããã«
ããã€ãã®éšåã«å€§ãŸãã«ãã«ãããããããšãæãŸããã æ¥ç¶ãå°ãªãã»ã©è¯ãã ããããéåžžãç¹å®ã®äžè¬çšèªã®ã»ãããèŠã€ããããšãå€æããŠããŸãã ç§ã¯ãããäž»é¡é åã®äžæ žãšåŒãã§ããŸãã ã³ã³ããã¹ãã¯ã«ãŒãã«ã«äŸåããå ŽåããããŸãã ã³ã³ããã¹ãéã®äŸåé¢ä¿ãåé¿ããããšã匷ããå§ãããŸãã æœåšçã«ããã®ã¢ãããŒãã¯æ žã®ãèšåŒµãã«ã€ãªãããŸãããã³ã³ããã¹ãã®çžäºäŸåæ§ã¯åŒ·åãªæ¥ç¶æ§ãçã¿åºããããã¯ãåããæ žãããæªãã§ãã
建ç¯
ããŒããšã¢ããã¿ã
ã¿ããã®ã¢ãŒããã¯ã㣠ã
ã¯ãªãŒã³ã¢ãŒããã¯ã㣠-ãããã®ã¢ãããŒãã¯ãã¹ãŠã
ãã¡ã€ã³ãã¢ããªã±ãŒã·ã§ã³ã®ã³ã¢ãšããŠäœ¿çšãããšããèãæ¹ã«åºã¥ããŠ
ããŸã ã ãšãŽã¡ã³ã¹ã¯ãããã¡ã€ã³ãããã³ãã€ã³ãã©ã¹ãã©ã¯ãã£ãã«ã€ããŠè©±ããšãã«ããã®åé¡ã«äœæ°ãªã察åŠããŸãã ããžãã¹ããžãã¯ã¯ãããã©ã³ã¶ã¯ã·ã§ã³ãããããŒã¿ããŒã¹ãããã³ã³ãããŒã©ãŒãããé
å»¶è² è·ããªã©ã®æŠå¿µã§ã¯åäœããŸããã nå±€-ã¢ãŒããã¯ãã£ã§ã¯ããããã®æŠå¿µãåºããããšã¯ã§ããŸããã èŠæ±ã¯ã³ã³ãããŒã©ãŒã«éããããããžãã¹ããžãã¯ãã«è»¢éããããããžãã¹ããžãã¯ãã¯
DAL
ãšå¯Ÿè©±ããŸãã ãŸãã
DAL
ã¯é£ç¶ããããã©ã³ã¶ã¯ã·ã§ã³ãããããŒãã«ãããããã¯ããªã©ã§ãã Clean Architectureã䜿çšãããšãäŸåé¢ä¿ãå転ããããšãã«ãã¬ãããåé¢ã§ããŸãã ãã¡ãããå®è£
ã®è©³çŽ°ãå®å
šã«ç¡èŠããããšã¯äžå¯èœã§ãã ãšã«ãããRDBMSãORMããããã¯ãŒãã³ã°ã¯ãããã®å¶éã課ããŸãã ãã ãã
Clean Architecture
ã䜿çšããå Žåã¯
Clean Architecture
ãããå¶åŸ¡ã§ããŸãã
n-layer
ã§ã¯ãæäžå±€ã®ã¹ãã¬ãŒãžæ§é ã«ããããåäžèšèªã
n-layer
åºå·ããããšã¯ã¯ããã«å°é£ã§ãã
Clean Architecture
ã¯ã
Bounded Context.
ããŸãæ©èœã
Bounded Context.
ç°ãªãã³ã³ããã¹ãã¯ç°ãªããµãã·ã¹ãã ãè¡šãå ŽåããããŸãã åçŽãªã³ã³ããã¹ãã¯ãåçŽãª
CRUD
å®è£
ããã®ãæé©ã§ãã é察称ããŒãã³ã³ããã¹ãã®å Žåã
CQRSãæé©ã§ã ã ç£æ»ãã°ãå¿
èŠãšãããµãã·ã¹ãã ã§ã¯ãã€ãã³ããœãŒã·ã³ã°ã䜿çšããã®ãçã«ããªã£ãŠããŸãã 垯åå¹
ãšåŸ
æ©æéã®å¶éãããèªã¿åããšæžã蟌ã¿ãèªã¿èŸŒãŸãããµãã·ã¹ãã ã®å Žåãã€ãã³ãé§ååã®ã¢ãããŒããæ€èšããã®ã¯çã«ããªã£ãŠããŸãã äžèŠãããã¯äžå¿«ã«æãããããããŸããã ããšãã°ã
CRUD
ãµãã·ã¹ãã ã§äœæ¥ãã
CQRS
ãµãã·ã¹ãã ããã¿ã¹ã¯ãåãåããŸããã ãã°ããã®éãããããã¹ãŠã®
Command
ãš
Query
æ°ããã²ãŒããšããŠèŠãå¿
èŠããããŸãã å¥ã®æ¹æ³-ã·ã¹ãã ãåäžã®ã¹ã¿ã€ã«ã§èšèšãã-ã¯è¿èŠçŒçã§ãã ã¢ãŒããã¯ãã£ã¯ããŒã«ã®ã»ããã§ãããåããŒã«ã¯ç¹å®ã®ã¿ã¹ã¯ã«é©ããŠããŸãã
ãããžã§ã¯ãæ§é
.NETãããžã§ã¯ãã次ã®ããã«æ§æããŸãã
/App /ProjectName.Web.Public /ProjectName.Web.Admin /ProjectName.Web.SomeOtherStuff /Domain /ProjectName.Domain.Core /ProjectName.Domain.BoundedContext1 /ProjectName.Domain.BoundedContext1.Services /ProjectName.Domain.BoundedContext2 /ProjectName.Domain.BoundedContext2.Command /ProjectName.Domain.BoundedContext2.Query /ProjectName.Domain.BoundedContext3 /Data /ProjectName.Data /Libs /Problem1Resolver /Problem2Resolver
Libs
ãã©ã«ããŒã®ãããžã§ã¯ãã¯ãã¡ã€ã³ã«äŸåããŸããã ã¬ããŒããcsv解æããã£ãã·ã³ã°ã¡ã«ããºã ãªã©ãããŒã«ã«ã®åé¡ã®ã¿ã解決ããŸãã ãã¡ã€ã³æ§é ã¯
BoundedContext'
察å¿ã
BoundedContext'
ã
Domain
ãã©ã«ããŒã®ãããžã§ã¯ãã¯
Data
ããç¬ç«ããŠããŸãã
Data
ã¯
DbContext
ã移è¡ãDALã«é¢é£ããæ§æããããŸãã
Data
ã¯ã移è¡ãæ§ç¯ããããã®
Domain
ãšã³ãã£ãã£ã«äŸåããŸãã
App
ãã©ã«ããŒã®ãããžã§ã¯ãã¯ãIOCã³ã³ãããŒã䜿çšããŠäŸåé¢ä¿ã泚å
¥ããŸãã ãããã£ãŠããã¡ã€ã³ã³ãŒããã€ã³ãã©ã¹ãã©ã¯ãã£ããæ倧éã«åé¢ããããšãå¯èœã§ãã
ãšã³ãã£ãã£ã®ã¢ããªã³ã°
ãšã³ãã£ãã£ãšã¯ãäžæã®èå¥åãæã€ãã¡ã€ã³ã®ãªããžã§ã¯ããæå³ããŸãã ããšãã°ãç¹å®ã®éšéã§èªå®ãååŸãããšããæèã§ãã·ã¢ã®äŒç€Ÿã説æããã¯ã©ã¹ãåãäžããŸãã
[DisplayName(" ()")] public class Company : LongIdBase , IHasState<CompanyState> { public static class Specs { public static Spec<Supplier> ByInnAndKpp(string inn, string kpp) => new Spec<Supplier>(x => x.Inn == inn && x.Kpp == kpp); public static Spec<Supplier> ByInn(string inn) => new Spec<Supplier>(x => x.Inn == inn); } // EF protected Company () { } public Company (string inn, string kpp) { DangerouslyChangeInnAndKpp(inn, kpp); } public void DangerouslyChangeInnAndKpp(string inn, string kpp) { Inn = inn.NullIfEmpty() ?? throw new ArgumentNullException(nameof(inn)); Kpp = kpp.NullIfEmpty() ?? throw new ArgumentNullException(nameof(kpp)); this.ValidateProperties(); } [Display(Name = "")] [Required] [DisplayFormat(ConvertEmptyStringToNull = true)] [Inn] public string Inn { get; protected set; } [Display(Name = "")] [DisplayFormat(ConvertEmptyStringToNull = true)] [Kpp] public string Kpp { get; protected set; } [Display(Name = " ")] public CompanyState State { get; protected set; } [DisplayFormat(ConvertEmptyStringToNull = true)] public string Comment { get; protected set; } [Display(Name = " ")] public DateTime? StateChangeDate { get; protected set; } public void Accept() { StateChangeDate = DateTime.UtcNow; State = AccreditationState.Accredited; } public void Decline(string comment) { StateChangeDate = DateTime.UtcNow; State = AccreditationState.Declined; Comment = comment.NullIfEmpty() ?? throw new ArgumentNullException(nameof(comment)); }
é©åãªéçŽãšé¢ä¿ãéžæããã«ã¯ãå€ãã®å Žåã1åã®å埩ã ãã§ã¯äžååã§ãã æåã«ãã¯ã©ã¹ã®åºæ¬æ§é ãããããã1察1ã1察å€ãããã³å€å¯Ÿå€ã®é¢ä¿ãå®çŸ©ããããŒã¿æ§é ã説æããŸãã 次ã«ãããžãã¹ããã»ã¹ããšã«æ§é ããã¬ãŒã¹ããBMPNãšãã¹ãã±ãŒã¹ã§ç¢ºèªããŸãã ããã€ãã®ã±ãŒã¹ãæ§é ã«é©åããªãå Žåãèšèšäžã«ééããçºçããæ§é ãå€æŽããå¿
èŠããããŸãã çµæãšããŠçããæ§é ã¯ããã€ã¢ã°ã©ã ã®åœ¢åŒã§é
眮ã§ããããã«äž»é¡åéã®å°é家ãšåæã§ããŸãã
å°é家ã¯ãèšèšãšã©ãŒãäžæ£ç¢ºããææããå ŽåããããŸãã ãã®éçšã§ãäžéšã®ãšã³ãã£ãã£ã«ã¯é©åãªçšèªããªãããšãå€æããå ŽåããããŸãã ãã®åŸããªãã·ã§ã³ãææ¡ãããã°ããããŠããæ£ãããã®ãèŠã€ããŸãã tezarusã«æ°ããçšèªãå°å
¥ãããŸããã çšèªãäžç·ã«è©±ãåã£ãŠåæããããšãéåžžã«éèŠã§ãã ããã«ãããå°æ¥ã®èª€è§£ã®åé¡ã®å€§ããªå±€ãæé€ãããŸãã
äžæã®èå¥åãéžæããŠãã ãã
幞ããªããšã«ããšãŽã¡ã³ã¹ã¯ãã®ç¹ã«é¢ããŠæ確ãªæšå¥šäºé
ãæ瀺ããŸãããŸãããµããžã§ã¯ããšãªã¢ã§TINãPPCããã¹ããŒãããŒã¿ãªã©ã®èå¥åãæ¢ããŸãã èŠã€ãã£ãå Žåã¯ãããã䜿çšããŸãã èŠã€ãããŸãã
GUID
ãŸãã¯ããŒã¿ããŒã¹çæ
Id
äŸåããŸãã ãã¡ã€ã³IDãååšããå Žåã§ãããã¡ã€ã³ID以å€ã®IDã䜿çšããããšããå§ãããŸãã ããšãã°ããšã³ãã£ãã£ãæ±çšæ§ããããã·ã¹ãã ã以åã®ãã¹ãŠã®ããŒãžã§ã³ãä¿åããå¿
èŠãããå Žåãããªããžã§ã¯ãã¢ãã«ã®èå¥åãè€éãªã³ã³ããžããã§ãããæ°žç¶æ§ã«å¯Ÿå¿ããŠããªãå Žåãªã©ã§ãã
æ¬ç©ã®ãã¶ã€ããŒ
ORMãªããžã§ã¯ããå
·äœåããã«ã¯ãåå°ãæããã䜿çšãããŸãã EFã¯ä¿è·ãããã³ã³ã¹ãã©ã¯ã¿ãŒã«å°éã§ããŸãããããã°ã©ããŒã¯å°éã§ããŸããã 圌ãã¯æ£ããæ³åŸãäœæããå¿
èŠããããŸãã TINããã³KPPã«ãã£ãŠèå¥ããã人ç©ã ãã¶ã€ããŒã«ã¯ã¬ãŒããè£
åãããŠããŸãã ééã£ããªããžã§ã¯ããäœæããŠããããŸããããŸããã æ¡åŒµã¡ãœãã
ValidateProperties
ã¯
DataAnnotation
å±æ§ã®
ValidateProperties
åŒã³åºãã
NullIfEmpty
ã¯ç©ºã®è¡ã®éä¿¡ã
NullIfEmpty
ãŸãã
public static class Extensions { public static void ValidateProperties(this object obj) { var context = new ValidationContext(obj); Validator.ValidateObject(obj, context, true); } public static string NullIfEmpty(this string str) => string.IsNullOrEmpty(str) ? null : str; }
TINãæ€èšŒããããã«ã次ã®åœ¢åŒã®å±æ§ãç¹å¥ã«èšè¿°ãããŠããŸãã
public class InnAttribute : RegularExpressionAttribute { public InnAttribute() : base(@"^(\d{10}|\d{12})$") { ErrorMessage = " 10/12 ."; } public InnAttribute(CivilLawSubject civilLawSubject) : base(civilLawSubject == CivilLawSubject.Individual ? @"^\d{12}$" : @"^\d{10}$") { ErrorMessage = civilLawSubject == CivilLawSubject.Individual ? " 12 ." : " 10 ."; } }
ãã©ã¡ãŒã¿ãŒã®ãªãã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãORMã«ã®ã¿äœ¿çšãããããã«ä¿è·ãããŠãããšå®£èšãããŠããŸãã åå°ã¯å®äœåã«äœ¿çšããããããã¢ã¯ã»ã¹ä¿®é£Ÿåã¯éªéã«ãªããŸããã äž¡æ¹ã®å¿
èŠãªãã£ãŒã«ãããå®éã®ãã³ã³ã¹ãã©ã¯ã¿ãŒïŒTINããã³KPPïŒã«è»¢éãããŸãã ã·ã¹ãã ã®ã³ã³ããã¹ãã«ãããæ³äººã®æ®ãã®ãã£ãŒã«ãã¯ãªãã·ã§ã³ã§ãããäŒç€Ÿã®æ
åœè
ãåŸã§èšå
¥ããŸãã
ã«ãã»ã«åãšæ€èšŒ
ããããã£TINããã³PPCã¯ãprotected-setterã§å®£èšãããŸãã EFã¯åã³ãããã«ã¢ã¯ã»ã¹ã§ããããã«ãªããããã°ã©ãã¯
DangerouslyChangeInnAndKpp
é¢æ°ã䜿çšããå¿
èŠããããŸãã é¢æ°ã®ååã¯ãTINãšãã§ãã¯ãã€ã³ãã®å€æŽãéåžžã®ç¶æ³ã§ã¯ãªãããšãæ確ã«ç€ºåããŠããŸãã 2ã€ã®ãã©ã¡ãŒã¿ãŒãé¢æ°ã«æž¡ãããŸããã€ãŸããTINãšPPCãå€æŽãããšãäžç·ã«ã®ã¿å€æŽãããŸãã TIN + PPCãè€åããŒã«ããããšãã§ããŸãã ããããäºææ§ã®ããã«ã
long Id
ãæ®ããŸããã æåŸã«ããã®é¢æ°ãåŒã³åºããããšãããªããŒã¿ãŒãæ©èœããTINãšPPCãæ£ãããªãå Žåã
ValidationException
ãã¹ããŒãããŸãã
åã·ã¹ãã ã¯ããã«åŒ·åã§ããŸãã ãã ããåç
§ã§èª¬æãããŠããã¢ãããŒãã«ã¯ãæšæºã®ASP.NETã€ã³ãã©ã¹ãã©ã¯ãã£ããã®ãµããŒãããªããšããé倧ãªæ¬ ç¹ããããŸãã ãµããŒããè¿œå ããããšãã§ããŸããããã®ãããªã€ã³ãã©ã¹ãã©ã¯ãã£ã³ãŒãã«ã¯äŸ¡å€ããããä»éããå¿
èŠããããŸãã
èªã¿åãçšã®ããããã£ãå€æŽããããã®ç¹å¥ãªæ¹æ³
ããžãã¹ããã»ã¹ã«å¿ããŠãçµç¹ã¯ãæ¿èªããŸãã¯ãæåŠããããå¯èœæ§ããããæåŠã®å Žåã¯ã³ã¡ã³ããæ®ãå¿
èŠããããŸãã ãã¹ãŠã®ããããã£ããããªãã¯ã§ããå Žåãããã¥ã¡ã³ãããã®ã¿ããã«ã€ããŠç¥ãããšãã§ããŸãã ãã®å Žåãã¹ããŒã¿ã¹å€æŽã«ãŒã«ã¯ã¡ãœããã·ã°ããã£ããèŠãããšãã§ããŸãã èšäºã§ã¯ãæ³äººã¯ã©ã¹ã®æçã®ã¿ãåŒçšããŸããã å®éãããå€ãã®ãã£ãŒã«ãããããç¹ã«æ°ããããŒã ã¡ã³ããŒãæ¥ç¶ããå Žåã¯ãäœãé¢é£ããŠããã®ããç解ããããšã¯éåžžã«åœ¹ç«ã¡ãŸãã æ瀺çãªããžãã¹ãªãã¬ãŒã·ã§ã³ãè¡ããã«ãããããã£ãä»ããéé¢ããŠå¶åŸ¡äžèœã«å€æŽã§ããå Žåã¯ãã»ãã¿ãŒãå
¬éããããšãã§ããŸãã ãã ãããã®ããããã£ã¯èŠåããå¿
èŠããããŸããããŒã¿ã«é¢é£ããæ瀺çãªæäœããªãå Žåããããããã®ããŒã¿ã¯äžèŠã§ããïŒ
å¥ã®æ¹æ³ã¯ãã ç¶æ
ããã¿ãŒã³ã䜿çšããŠãåäœãå¥ã®ã¯ã©ã¹ã«é
眮ããããšã§ãã
ãã°ããã®éã
Queryable
å€æŽããã
ãåŒããªãŒãããã£ããããæ¡åŒµæ©èœãäœæããæ¹ãè¯ãããšã¯æ確ã§ã¯ãããŸããã§ããã æçµçã«ã
LinqSpecså®è£
ãæã䟿å©ã§ããããšã
å€æããŸããã
æ¡åŒµã¡ãœãã
ã€ã³ã¿ãŒãã§ã€ã¹ã®ã¢ãããã¯ããªã¢ãŒãã£ãºã ïŒåŸç¶è
ããšã«ã¡ãœãããå®è£
ããå¿
èŠããªãããã«ïŒ
ã¯ãé
ããæ©ããCïŒã«è¡šç€ºãããŸãã ãããŸã§ã®ãšãããæ¡åŒµã¡ãœããã«æºè¶³ããå¿
èŠããããŸãã
public interface IHasId { object Id { get; } } public interface IHasId<out TKey> : IHasId where TKey: IEquatable<TKey> { new TKey Id { get; } } public static bool IsNew<TKey>(this IHasId<TKey> obj) where TKey : IEquatable<TKey> { return obj.Id == null || obj.Id.Equals(default(TKey)); }
æ¡åŒµã¡ãœããã¯ãè¡šçŸåãé«ããããã«LINQã§ã®äœ¿çšã«é©ããŠããŸãã ãã ãã
ByInnAndKpp
ããã³
ByInn
ã¯ãä»ã®åŒã®å
éšã§ã¯äœ¿çšã§ããŸããã ãããã€ããŒã解æããããšã¯ã§ããŸããã æ¡åŒµã¡ãœããã®äœ¿çšã®è©³çŽ°ã«ã€ããŠã¯ã
DSL
ãDino Espositoã«
DotNextã®1ã€ã«ã€ããŠèªã£ãŠããŸãã
public static class CompanyDataExtensions { public static CompanyData ByInnAndKpp( this IQueryable<CompanyData> query, string inn, string kpp) => query .Where(x => x.Company, Supplier.Specs.ByInnAndKpp(inn, kpp)) .FirstOrDefault(); public static CompanyData ByInn( this IQueryable<CompanyData> query, string inn) => query .Where(x => x.Company, Supplier.Specs.ByInn(inn)); }
2ã€ã®ãã©ã¡ãŒã¿ãŒãæã€ç°åžžãªWhereã«æ³šæããŠ
ãã ãã ã
EF Core
çŸåš
InvokeExpression
ãµããŒãããŠã
InvokeExpression
ã ã¢ããªã±ãŒã·ã§ã³ã§ã¯ã次ã®ããã«ã³ãŒãã䜿çšãããŸãã
var priceInfos = DbContext .CompanyData .ByInn("") .ToList();
å¥ã®æ¹æ³ã¯ã
SelectMany
ã䜿çšããããšã§ãã
var priceInfos = DbContext .Company // extension- .ByInnAndKpp("", "") .SelectMany(x => x.Company) .ToList();
IQueryProvider
ã®èŠ³ç¹ããã®Select
ãšSelectMany
ãªãã·ã§ã³ã®ç䟡æ§ã®åé¡ã¯ããŸã å®å
šã«ã¯ç 究ããŠããŸããã ã³ã¡ã³ãã§ãã®ãããã¯ã«é¢ããæ
å ±ãããã ããã°å¹žãã§ãã
é¢é£ã³ã¬ã¯ã·ã§ã³
public virtual ICollection<Document> Documents { get; protected set; }
company.Documents.Where(âŠ).ToList()
ã®åœ¢åŒã®ã³ãŒãã¯ããŒã¿ããŒã¹ãžã®ã¯ãšãªãäœæãããæåã«é¢é£ãããã¹ãŠã®ãšã³ãã£ãã£ãRAMã«é©çšããããã
Select
ãããã¯ã§ã®ã¿äœ¿çšããŠSQLã¯ãšãªã«å€æããããšããå§ãããŸãã¡ã¢ãªå
ã®ãµã³ããªã³ã°ã ãããã£ãŠãã¢ãã«å
ã®ã³ã¬ã¯ã·ã§ã³ã®ååšã¯ãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã«æªåœ±é¿ãäžããå¯èœæ§ããããŸãã åæã«ãå¿
èŠãª
IQueryable
ãå€éšãã転éããå¿
èŠãããããããªãã¡ã¯ã¿ãªã³ã°ã¯å°é£ã§ãã ãªã¯ãšã¹ãã®å質ãå¶åŸ¡ããã«ã¯ã
miniProfilerã調ã¹ãå¿
èŠããããŸãã
ãµãŒãã¹
貧匱ã¢ãã«ã§ã¯ãäžè¬ã«ããã¹ãŠã®ããžãã¯ã¯ãµãŒãã¹ã«ä¿åãããŸãã ããžãã¯ãéçŽã³ãŒãã§äžé©åã§ããããéçŽéã®çžäºäœçšãèšè¿°ããŠããå Žåãå¿
èŠãªå Žåã«ã®ã¿ãµãŒãã¹ãè¿œå ããããšã奜ã¿ãŸãã æé©ãªãªãã·ã§ã³ã¯ããã¡ã€ã³ã«ãµãŒãã¹ã®æ£ç¢ºãªååïŒãã¬ãžãããå庫ãããã³ãŒã«ã»ã³ã¿ãŒãïŒãå«ãŸããŠããå Žåã§ãã ãã®å Žåãæ¥å°ŸèŸãServiceãã¯çç¥ã§ããŸãã åã¯ã©ã¹ã®ã¡ãœããã®ã»ããã¯ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹èŠçŽ ã§ã°ã«ãŒãåããããŠãŒã¹ã±ãŒã¹ã®ã»ããã«å¯Ÿå¿ããŠããŸãã ã€ã³ã¿ãŒãã§ã€ã¹ã
Task Based UI
ã¹ã¿ã€ã«ã§èšèšãããŠããå ŽåãããŸãæ©èœããŸãã
æžã蟌ã¿ã¡ãœããã¯ããšã³ãã£ãã£ãŸãã¯DTOãå
¥åãšããŠåãå
¥ããŸãã ãªã¯ãšã¹ãã¯ãã¡ãœãããå®è¡ãããåã«å³å¯ã«å¥ã®ã¬ã€ã€ãŒã§æ€èšŒãããŸãã ã¡ãœããã倱æããå¯èœæ§ãããå Žåã¯ã
Result
ã¿ã€ãã䜿çšããŠçœ²åã§æ瀺çã«æå®ããå¿
èŠããããŸãã äŸå€çãªç¶æ³ã«ã€ããŠã¯äŸå€ãæ®ã£ãŠããŸãã
èªã¿åãã¡ãœããã¯ãã·ãªã¢ã«åããŠã¯ã©ã€ã¢ã³ãã«éä¿¡ããDTOãè¿ããŸãã
AutoMapperãš
Mapsterã® Queryable Extensions
ãããã§ããããã³ã°ã䜿çšããŠ
Select
åŒã«å€æããããšãã§ããŸããããã«ãããããŒã¿ããŒã¹å
šäœãããšã³ãã£ãã£å
šäœããã©ãã°ã§ããªããªããŸãã
ãããŒãžã£ãŒ
åããŠãããå
ã§ã®æäœã«ã¯ã»ãšãã©äœ¿çšããŸããã ããšãã°ã
AspNet.Identity
ã«ã¯
UserManager
ãå«ãŸããŠããŸãã åºæ¬çã«ã管çè
ã¯ããã¡ã€ã³ã«çŽæ¥é¢é£ããŠããªãéçŽã«ããžãã¯ãå®è£
ããå¿
èŠãããå Žåã«å¿
èŠã§ãã
ãŠããªã³åã®TPT
å Žåã«ãã£ãŠã¯ã1ã€ã®ãšã³ãã£ãã£ãä»ã®ããã€ãã®ãšã³ãã£ãã£ã®1ã€ã«é¢é£ä»ããããããšããããŸãã äžè²«ããã¹ãã¬ãŒãžã·ã¹ãã ãäœæããã«ã¯ã
TPTã䜿çšããå¶åŸ¡ãããŒã«ã¯
ãã¿ãŒã³ãããã³ã°ã䜿çšã§ããŸãã ãã®ã¢ãããŒãã«ã€ããŠã¯ã
å¥ã®èšäºã§è©³ãã説æããŠ
ããŸã ã
DataMapper
ã䜿çšãããšãã€ã©ãŒãã¬ãŒãã³ãŒãã®æ°ãæžãã
Queryable Extensions
䜿çšãããšã
Select
æåã§èšè¿°ããããšãªãDTOèŠæ±ãäœæã§ããŸãã ãããã£ãŠãRAMã§ã®ãããã³ã°ããã³
IQueryProvider
åŒããªãŒã®æ§ç¯ã«åŒãåå©çšã§ããŸãã
AutoMapper
ã¡ã¢ãªå
AutoMapper
éåžžã«è²ªæ¬²ã§é«éã§ã¯ãªããããæéã
çµã€ã«ã€ããŠMapsterã«çœ®ãæããããŸããã
åã
ã®ãµãã·ã¹ãã ã®CQRS
äžç¢ºå®æ§ã®é«ãæ¡ä»¶ã§äœæ¥ããå Žåãèšèšãšã©ãŒã®ãªã¹ã¯ã倧ãããªããŸãã ããŒã¿ããŒã¹æ§é ãèšèšããããéæ£èŠåã«ã€ããŠæ±ºå®ããããã¹ãã¢ãããã·ãŒãžã£ãèšè¿°ãããããåã«ãè¿
éãªãããã¿ã€ãã³ã°ãšä»®èª¬ã®ãã¹ãã«é Œãããšã¯çã«ããªã£ãŠããŸãã èªä¿¡ãããå ŽåïŒå
¥åãšåºåã«äœãããããæé©åã§ããŸãã
å®è£
ã³ãã³ãããªãå Žåã
IQuery
ã¯åãå
¥åã§åãçµæãè¿ããŸãã ãããã£ãŠããã®ãããªã¡ãœããã®æ¬äœã¯ç©æ¥µçã«ãã£ãã·ã¥ã§ããŸãã ãããã£ãŠãå®è£
ã眮ãæããåŸãã€ã³ãã©ã¹ãã©ã¯ãã£ã³ãŒãïŒã³ã³ãããŒã©ãŒïŒã¯å€æŽãããã
IQuery
ã¡ãœããã®æ¬äœã®ã¿ãå€æŽããå¿
èŠããããŸãã ãã®ã¢ãããŒãã«ãããã¢ããªã±ãŒã·ã§ã³ããã¹ãŠã§ã¯ãªããå°ããªéšåã§åå¥ã«æé©åã§ããŸãã
ãã®ã¢ãããŒãã¯ãIOCã³ã³ããã®ãªãŒããŒããããšãªã¯ãšã¹ãããšã®ã©ã€ãã¹ã¿ã€ã«ã®ã¡ã¢ãªãã©ãã£ãã¯ã®ããã«ãéåžžã«å¿ãããªãœãŒã¹ã«é©çšã§ããŸããã ãã ããããŒã¿ããŒã¹ã®äŸåé¢ä¿ãã³ã³ã¹ãã©ã¯ã¿ãŒã«æ³šå
¥ããã代ããã«usingæ§æã䜿çšããå Žåããã¹ãŠã®IQuery
ãã·ã³ã°ã«ãã³ã«ããããšãã§ããŸãã
ã¬ã¬ã·ãŒã³ãŒãã䜿çšãã
æ¢åã®ã³ãŒãããŒã¹ã䜿çšããå Žåãäœæ¥ã®åœ¢åŒïŒããµããŒãããŸãã¯ãéçºãïŒã決å®ããå¿
èŠããããŸãã æåã®ã±ãŒã¹ã§ã¯ãæ°ããæ©èœã®åºçŸãšã·ã¹ãã ã®æ¹è¯ã¯æåŸ
ãããŠããŸããã æ倧ã¯ãããã€ãã®æ°ããã¬ããŒããè¿œå ããããšã§ããããã€ãã®ãã©ãŒã ã¯ãã¡ãã¡ã«ãããŸãã 第äºã«-äž»é¡ã¢ãã«ããã³/ãŸãã¯ã¢ãŒããã¯ãã£å
šäœã®éèŠãªåŠçãå¿
èŠã§ãã ãããžã§ã¯ãããéçºãã§ã¯ãªãããµããŒããããå¿
èŠãããå Žåãããããã©ãã»ã©æåããŠãããã«é¢ä¿ãªããæ¢åã®ã«ãŒã«ã«åŸãããšããå§ãããŸãã ããªããããªãã®åã«ççŽãªgovnokodãæã£ãŠãããªãã°ããããå°ç¡ãã«ãããšããç³ãåºãæåŠããã»ããããã§ãã
ãããžã§ã¯ãéçºã¯ããè€éãªã¿ã¹ã¯ã§ãã ãªãã¡ã¯ã¿ãªã³ã°ã®ãããã¯ã¯ããã®èšäºã®ç¯å²å€ã§ãã ã
è
æé²æ¢ã¬ã€ã€ãŒ ããšã
ã¹ãã©ã³ã°ã©ãŒ ããšãã2ã€ã®æãæçšãªãã¿ãŒã³ã®ã¿ã«æ³šç®ããŸãã ãããã¯éåžžã«äŒŒãŠããŸãã äž»ãªã¢ã€ãã¢ã¯ãå€ãã³ãŒãããŒã¹ãšæ°ããã³ãŒãããŒã¹ã®éã«ããã¡ãµãŒãããæ§ç¯ãã
ããšã§ãããåŸã
ã«ã·ã¹ãã å
šäœãæçç
ã«æžãæãã
象ãããŸãã ãã¡ãµãŒãã¯ãå€ãã³ãŒãããŒã¹ã®åé¡ãæ°ããã³ãŒãããŒã¹ã«æµžéããããšãèš±å¯ãããå€ãããžãã¹ããžãã¯ãæ°ããããžãã¹ããžãã¯ã«ç¢ºå®ã«ãããã³ã°ããéå£ã®åœ¹å²ãæãããŸãã ãã¡ãµãŒããå®å
šã«ãããã³ã°ãããªãã¯ãæŸèæã§æ§æãããé
ããæ©ãããå€ãã³ãŒãããŒã¹å
šäœãšãšãã«å¿åŽã«æ²ãããšã«æ³šæããŠãã ããã