CQRSã¯ãèªã¿åãæäœãæžãèŸŒã¿æäœããåé¢ããã¢ãŒããã¯ãã£ã¹ã¿ã€ã«ã§ãã ãã®ã¢ãããŒãã¯ãBertrand Meyerã«ãã£ãŠææ¡ãããCQSååã«åºã¥ããŠGreg Youngã«ãã£ãŠçå®ãããŸããã ã»ãšãã©ã®å ŽåïŒåžžã«ã§ã¯ãããŸãããïŒCQRSã¯ãDDDã«åºã¥ããŠèšèšãããã¢ããªã±ãŒã·ã§ã³ã®
å¢çä»ãã³ã³ããã¹ãã§å®è£
ãããŸãã CQRSã®éçºã®èªç¶ãªçç±ã®1ã€ã¯ãèªã¿åããµãã·ã¹ãã ãšæžã蟌ã¿ãµãã·ã¹ãã ã§ã®ããžãã¹ããžãã¯ã®è² è·ãšè€éãã®é察称çãªåæ£ã§ãããã»ãšãã©ã®ããžãã¹ã«ãŒã«ãšè€éãªãã§ãã¯ã¯æžã蟌ã¿ãµãã·ã¹ãã ã«ãããŸãã åæã«ã圌ãã¯å€æŽãããããé »ç¹ã«é »ç¹ã«ããŒã¿ãèªã¿åããŸãã
æŠå¿µã¯åçŽã§ãããCQRSã®å®è£
ã®è©³çްã¯å€§ããç°ãªãå ŽåããããŸãã ãããŠãããã¯ãŸãã«æªéã詳现ã«ããå Žåã§ãã
ICommand
ããICommand
ãž
å€ãã®äººã¯ãã
ããŒã ããã¿ãŒã³ã䜿çšããŠCQRSã®å®è£
ãéå§ãã1ã€ã®ã¯ã©ã¹ã§ããŒã¿ãšåäœãçµã¿åãããŸãã
public class PayOrderCommand { public int OrderId { get; set; } public void Execute() {
ããã«ãããã³ãã³ãã®ã·ãªã¢ã«å/éã·ãªã¢ã«åãšäŸåæ§æ³šå
¥ãè€éã«ãªããŸãã
public class PayOrderCommand { public int OrderId { get; set; } public PayOrderCommand(IUnitOfWork unitOfWork) {
ãããã£ãŠãå
ã®ã³ãã³ãã¯ãããŒã¿ã-DTOãšãã³ãã³ããã³ãã©ãã®åäœã«åå²ãããŸãã ãããã£ãŠããã³ãã³ããèªäœã«ã¯äŸåé¢ä¿ãå«ãŸããªããªãã以äžãå«ã
Parameter ObjectãšããŠäœ¿çšã§ããŸãã ã³ã³ãããŒã©ãžã®åŒæ°ãšããŠã
public interface ICommandHandler<T> { public void Handle(T command) {
ãã³ãã©ãŒå
ã§æ€èšŒãè¡ããªãããã«ãã³ãã³ãå
ã®Idã§ã¯ãªããšã³ãã£ãã£ãŒã䜿çšããå Žåããã®æ¹æ³ã«ã¯æ¬ ç¹ããããŸããã Model BindingããªãŒããŒã©ã€ãã§ããŸãã å°ãåŸãæšæºã®ã¢ãã«Binidngã倿Žããã«æ€èšŒãã¬ã³ããªã³ã°ããæ¹æ³ãèŠãŠãããŸãã
ICommandHandlerã¯åžžã«voidãè¿ãå¿
èŠããããŸããïŒ
ãã³ãã©ãŒã¯èªã¿åããŸãããããã¯èªã¿åãã®ããã§ãããµãã·ã¹ãã ãšQueryã®äžéšã§ãããããåžžã«
void
è¿ãå¿
èŠããã
void
ã ããããããŒã¿ããŒã¹ã«ãã£ãŠçæãããIDã¯ã©ãã§ããããïŒ ããšãã°ããæ³šæããããšããã³ãã³ããéä¿¡ããŸããã æ³šæçªå·ã¯ãããŒã¿ããŒã¹ã®IDã«å¯Ÿå¿ããŠããŸãã IDã¯ã
INSERT
èŠæ±ãå®äºãããŸã§ååŸã§ããŸããã 人ã
ãæãä»ããªãã®ã¯ããã®æ¶ç©ºã®å¶éãåé¿ããããšã§ãã
CreateOrderCommandHandler
ãé£ç¶ããŠåŒã³åºããŠããã IdentityQueryHandler<Order>
- åºå-ãã©ã¡ãŒã¿ãŒ
- ã³ãã³ããžã®æ»ãå€ã«ç¹å¥ãªããããã£ã远å ãã
- ã€ãã³ã
- GUIDãåªå
ããŠèªåã€ã³ã¯ãªã¡ã³ãIDãåé¿ããŸãã ã¬ã€ãã¯ããŒã ã®ããã£ã«å
¥ã£ãŠããŒã¿ããŒã¹ã«æžã蟌ãŸããŸã
ããŠãããŒã¿ããŒã¹ãžã®ã¯ãšãªãªãã§ã¯å®è¡ã§ããªãæ€èšŒã«ã€ããŠã¯ã©ãã§ãããããããšãã°ãç¹å®ã®IDãŸãã¯ã¯ã©ã€ã¢ã³ãã®ã¢ã«ãŠã³ãã®ç¶æ
ãæã€ããŒã¿ããŒã¹å
ã®ãšã³ãã£ãã£ã®ååšãªã©ã§ãã ããã§ã¯ãã¹ãŠãç°¡åã§ãã æ€èšŒã«ãäŸå€ãã¯ãªããšããäºå®ã«ãããããããã»ãšãã©ã®å Žåããããã¯åã«äŸå€ãã¹ããŒããŸãã
ã°ã¬ãã°ã€ã³ã°ã¯ã
ãã®åé¡ã«é¢ããèªåã®ç«å Ž
ãæç¢ºã«è¿°ã¹ãŠããŸãïŒ25åïŒïŒã
ã³ãã³ããã³ãã©ãŒã¯åžžã« void
è¿ãã¹ãã§ããïŒ
ãããããšã©ãŒãŸãã¯äŸå€ã®ãªã¹ãã¯å®è¡ã®çµæã§ããå¯èœæ§ããããŸãã ãã³ãã©ãŒ
㯠ãæäœã®çµæãè¿ãå ŽåããããŸãã
Query
ã®äœæ¥ã«é¢äžãã¹ãã§ã¯ãããŸãã-ããŒã¿ãã€ãã³ã°ã¯ãå€ãè¿ãããšãã§ããªãããšãæå³ããŸããã ããã«é¢ããäž»ãªå¶éã¯ãã·ã¹ãã èŠä»¶ãšéåæçžäºäœçšã¢ãã«ã䜿çšããå¿
èŠæ§ã§ãã ã³ãã³ããåæçã«å®è¡ãããã代ããã«ãã¥ãŒã«å
¥ããããŠåŸã§åŠçãããããšã確å®ã«ããã£ãŠããå Žåã¯ãHTTPãªã¯ãšã¹ãã®ã³ã³ããã¹ãã§IdãååŸããããšãæåŸ
ããªãã§ãã ããã
Guid
æäœãšã¯ãšãªã¹ããŒã¿ã¹ã®ååŸãã³ãŒã«ããã¯ã®æäŸããŸãã¯Webãœã±ãããä»ããå¿çã®ååŸãè¡ãããšãã§ããŸãã ã©ã¡ãã®å Žåã§ãããã³ãã©ãŒå
ã®
void
ãŸãã¯non
void
ã¯ãåé¡ã®å°ãªãæ¹ã§ãã éåæã¢ãã«ã§ã¯ãã€ã³ã¿ãŒãã§ã€ã¹ãå«ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹å
šäœã倿Žããå¿
èŠããããŸãïŒOzonãŸãã¯Aviasalesã§ã®èªç©ºåžã®æ€çŽ¢ã®æ§åãã芧ãã ããïŒã
æ»ãå€ãšããŠ
void
ã䜿çšãããšãåæã¢ãã«ãšéåæã¢ãã«ã«1ã€ã®ã³ãŒãããŒã¹ã䜿çšã§ãããšæåŸ
ããªãã§ãã ããã æå³ã®ããæ»ãçµæããªãããšã¯ãAPIã®æ¶è²»è
ã誀解ãããå¯èœæ§ããããŸãã ãšããã§ãå¶åŸ¡ãããŒã®äŸå€ã䜿çšããŠãããã³ãã©ãŒããå€ãè¿ããŸãããæé»çã«ãããè¡ãã ãã§ã
æ§é ããã°ã©ãã³ã°ã®ååã«éåã
ãŸã ã
念ã®ããã
DotNextã® 1
ã€ã§ã Dino Espositoã«æèŠãæ±ããŸããã 圌ã¯ã€ã³ã°ã«åæããŸãããã³ãã©ãŒã¯å¿çãè¿ãããšãã§ããŸãã
void
ã§ã¯ãªããããããŸããããããŒã¿ããŒã¹ã®ããŒã¿ã§ã¯ãªããæäœã®çµæã§ããå¿
èŠããããŸãã CQRSã¯ããã°ãã§ã¯ãªããç¹å®ã®ç¶æ³ïŒèªã¿åããµãã·ã¹ãã ãšæžã蟌ã¿ãµãã·ã¹ãã ã®ç°ãªãèŠä»¶ïŒã§å©çãããããé«ã¬ãã«ã®æŠå¿µã§ãã
FïŒã§ã¯ã void
ãš void
å¢çç· void
ããã«ç®ç«ã¡ãŸããã FïŒã®void
å€ã¯Unit
åã«å¯Ÿå¿ããŸãã 颿°åããã°ã©ãã³ã°èšèªã®Unit
ã¯ãå€ã®ãªãäžçš®ã®ã·ã³ã°ã«ãã³ã§ãã ãããã£ãŠã void
ãš void
éãã¯ãæœè±¡åã§ã¯ãªãæè¡çãªå®è£
ã«ãããã®ã§ãã Mark Simanã®ããã°ã§ void
ãšunit
ã«ã€ããŠè©³ããèªãããšãã§ããŸãã
ã¯ãšãªã¯ã©ãã§ããïŒ
CQRSã®ã¯ãšãªã¯ã
ã¯ãšãªãªããžã§ã¯ãã«äŒŒãŠããå ŽåããããŸãã ãã ããå®éã«ã¯ãããã¯ç°ãªãæœè±¡åã§ãã ã¯ãšãªãªããžã§ã¯ãã¯ããªããžã§ã¯ãã¢ãã«ã䜿çšããŠSQLãçæããããã®ç¹æ®ãªãã¿ãŒã³ã§ãã .NETã§ã¯ã
LINQ
ãš
Expression Trees
åºçŸã«ãã
Expression Trees
ãã¿ãŒã³ã®é¢é£æ§ã倱ãããŸããã CQRSã®
Query
ã¯ãã¯ã©ã€ã¢ã³ãã«ãšã£ãŠäŸ¿å©ãªåœ¢åŒã§ããŒã¿ãåä¿¡ããããã®èŠæ±ã§ãã
Command
CommandHandler
顿šã«ãã
CommandHandler
Query
ãš
QueryHandler
ãåé¢ããããšã¯è«çç
QueryHandler
ã ãã®å Žåã
QueryHandler
å®éã«
void
è¿ãããšã¯ã§ããŸããã èŠæ±æã«äœãèŠã€ãããªãå Žåã¯ã
null
ãè¿ããã
ç¹å¥ãªã±ãŒã¹ã䜿çšã§ã
null
ã
ãããã
CommandHandler<TIn, TOut>
ãš
QueryHandler<TIn, TOut>
ã®æ ¹æ¬çãªéãã¯äœã§ããïŒ ãããã®çœ²åã¯åãã§ãã çãã¯åãã§ãã ã»ãã³ãã£ã¯ã¹ã®éãã
QueryHandler
ã¯ããŒã¿ãè¿ããã·ã¹ãã ã®ç¶æ
ã倿ŽããŸããã
CommandHandler
ã
CommandHandler
ã¯ç¶æ
ã倿Žãã
å Žåã«ãã£ãŠã¯æäœã®ã¹ããŒã¿ã¹ãè¿ããŸãã
ã»ãã³ãã£ã¯ã¹ãååã§ãªãå Žåã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã«ãã®ãããªå€æŽãå ããããšãã§ããŸãã
public interface IQuery<TResult> { } public interface IQueryHandler<TQuery, TResult> where TQuery : IQuery<TResult> { TResult Handle(TQuery query); }
TResult
åã¯ããã«ãã¯ãšãªã«æ»ãå€ããããããããã€ã³ãããããšã匷調ããŠããŸãã ãã®å®è£
ã¯ãSimple Injectoréçºè
ã®
ããã°ãš .NETã®Dependency Injectionã®å
±èè
ã§ããStephen van Deyrsenã®ããã°ã§èŠã€ããŸããã å®è£
ã§ã¯ããªããžã§ã¯ãã®ã¿ã€ããæå®ããã«ãªã¯ãšã¹ããå®è¡ãããŠããããšãIDEç»é¢ã§ããã«ç¢ºèªã§ããããã«ãã¡ãœããåã
Ask
ã«ãã
Handle
ã«çœ®ãæããããšã«éå®ããŸããã
public interface IQueryHandler<TQuery, TResult> { TResult Ask(TQuery query); }
ä»ã®ã€ã³ã¿ãŒãã§ãŒã¹ãå¿
èŠã§ããïŒ
ããæç¹ã§ãä»ã®ãã¹ãŠã®ããŒã¿ã¢ã¯ã»ã¹ã€ã³ã¿ãŒãã§ã€ã¹ã廿£ãããããã«èŠãããããããŸããã ããã€ãã®
QueryHandler'
ããããããããã«å€ãã®ãã³ãã©ãŒãåéããŸãã
QueryHandler'
ã¯ããŠãŒã¹ã±ãŒã¹AãšBãå¥ã
ã«ããã远å ã®å€æãªãã§A + BããŒã¿ãè¿ãå¥ã®ãŠãŒã¹ã±ãŒã¹ãå¿
èŠãªå Žåã«ã®ã¿æå³ããããŸãã æ»ãå€ã®ã¿ã€ãã«ãã£ãŠã
QueryHandler
ãäœãè¿ããã¯å¿
ãããæããã§ã¯ãããŸããã ãã®ãããããŸããŸãªæ±çšãã©ã¡ãŒã¿ãŒãæã€ã€ã³ã¿ãŒãã§ã€ã¹ã§æ··ä¹±ããã®ã¯ç°¡åã§ãã ããã«ãCïŒã¯åé·ã§ãã
public class SomeComplexQueryHandler { IQueryHandler<FindUsersQuery, IQueryable<UserInfo>> findUsers; IQueryHandler<GetUsersByRolesQuery, IEnumerable<User>> getUsers; IQueryHandler<GetHighUsageUsersQuery, IEnumerable<UserInfo>> getHighUsage; public SomeComplexQueryHandler( IQueryHandler<FindUsersQuery, IQueryable<UserInfo>> findUsers, IQueryHandler<GetUsersByRolesQuery, IEnumerable<User>> getUsers, IQueryHandler<GetHighUsageUsersQuery, IEnumerable<UserInfo>> getHighUsage) { this.findUsers = findUsers; this.getUsers = getUsers; this.getHighUsage = getHighUsage; } }
QueryHandler
ãç¹å®ã®ãŠãŒã¹ã±ãŒã¹ã®ãšã³ããªãã€ã³ããšããŠäœ¿çšããæ¹ã䟿å©ã§ãã å
éšã§ããŒã¿ãåä¿¡ããã«ã¯ãå°çšã®ã€ã³ã¿ãŒãã§ã€ã¹ãäœæããŸãã ãããã£ãŠãã³ãŒãã¯ããèªã¿ããããªããŸãã
å°ããªé¢æ°ã倧ããªé¢æ°ã«ã³ã³ãã€ã«ãããšããèããæ°ã«ãªããªããã°ãããã°ã©ãã³ã°èšèªã®å€æŽãæ€èšããŠãã ããã FïŒã§ã¯ããã®ã¢ã€ãã¢ãã¯ããã«å
·äœåãããŠããŸãã
æžã蟌ã¿ãµãã·ã¹ãã ã¯èªã¿åããµãã·ã¹ãã ã䜿çšã§ããŸããïŒ
å¥ã®æçŸ©ã¯ãæžã蟌ã¿ãµãã·ã¹ãã ãšèªã¿åããµãã·ã¹ãã ãæ··åšãããªãããšã§ãã å³å¯ã«èšãã°ãããã§ã¯ãã¹ãŠãçå®ã§ãã ã³ãã³ããã³ãã©ãŒå
ã§
QueryHandler
ããããŒã¿ãååŸããå Žåã¯ããã®ãµãã·ã¹ãã ã§ã¯CQRSãäžèŠã§ããããšãæå³ããŸãã CQRSã¯ç¹å®ã®åé¡ã解決ããŸããèªã¿åã-ãµãã·ã¹ãã ã¯è² è·ãåŠçã§ããŸããã
æè¿ãŸã§DDDã°ã«ãŒãã§æã人æ°ã®ãã£ã質åã®1ã€ã¯ããDDDã䜿çšããŠãããããã«å¹Žæ¬¡å ±åæžããããŸãã ãã«ãããããšãããšãããžãã¹ããžãã¯ã¬ã€ã€ãŒãRAMå
ã®éèšãäžããRAMãäžè¶³ããŸãã ã©ã®ããã«ãªããŸããïŒã æé©åãããSQLã¯ãšãªãæåã§èšè¿°ããæ¹æ³ã¯æããã§ãã åãããšãèšªåæžã¿WebãªãœãŒã¹ã«ãåœãŠã¯ãŸããŸãã ããŒã¿ããã£ãã·ã¥ãããã³è¡šç€ºãåä¿¡ããããã«ãã¹ãŠã®OOPã®çŽ æŽããããäžããå¿
èŠã¯ãããŸããã CQRS-åªããåå²ç¹ãæäŸããŸããã³ãã³ããã³ãã©ãŒã§ã¯ãã¡ã€ã³ããžãã¯ã䜿çšããŸããããŒã ãããŸãå€ããªãããããŸããã¹ãŠã®ããžãã¹ã«ãŒã«ãã§ãã¯ãå®è¡ããããã§ãã éã«ãèªã¿åããµãã·ã¹ãã ã§ã¯ãããžãã¹ããžãã¯ã®å±€ããã€ãã¹ããããšãæãŸããã®ã§ãã
èªã¿åããµãã·ã¹ãã ãšæžã蟌ã¿ãµãã·ã¹ãã ãçµã¿åãããããšã«ãããåå²ç¹ã倱ããŸãã ã»ãã³ãã£ãã¯æœè±¡åã®æå³ã¯ã1ã€ã®ãªããžããªã®ã¬ãã«ã§ã倱ãããŸãã read-ãµãã·ã¹ãã ãç°ãªãããŒã¿ãŠã§ã¢ããŠã¹ã䜿çšããå Žåãã·ã¹ãã ãäžè²«ããç¶æ
ã«ãããšããä¿èšŒã¯ãŸã£ãããããŸããã ããŒã¿ã®é¢é£æ§ã¯ä¿èšŒãããªããããããžãã¹å±€ã®ãã§ãã¯ã®æå³ã¯å€±ãããŸãã èªã¿åããµãã·ã¹ãã ã§æžã蟌ã¿ãµãã·ã¹ãã ã䜿çšãããšãéåžžãæäœã®æå³ãšççŸããŸããå®çŸ©ã«ããã³ãã³ãã¯ã·ã¹ãã ã®ç¶æ
ã倿Žããã¯ãšãªã¯å€æŽããŸããã
ãã ããåã«ãŒã«ã«ã¯äŸå€ããããŸãã
åããããªã®1ååã«ãã°ã¬ãã°ã¯äŸã瀺ããŸãããèšç®ãè¡ãã«ã¯ãæ°çŸäžã®ãšã³ãã£ãã£ãèªã¿èŸŒãå¿
èŠããããŸãã ãã®ãã¹ãŠã®ããŒã¿ãRAMã«èªã¿èŸŒãããæé©ãªã¯ãšãªãå®è¡ããŸããïŒã èªã¿åããµãã·ã¹ãã ã«ãã§ã«é©åãªã¯ãšãªãã³ãã©ãããã1ã€ã®ããŒã¿ãœãŒã¹ã䜿çšããŠããå Žåãã³ãã³ããã³ãã©ããã¯ãšãªãåŒã³åºãããã«èª°ãååæã«å
¥ããããŸããã ããã«å¯Ÿããè°è«ã«çæããŠãã ããã
QueryHandler
ãããšã³ãã£ãã£ãŸãã¯DTOãQueryHandler
ãŸããïŒ
DTOã ã¯ã©ã€ã¢ã³ããããŒã¿ããŒã¹ã®ãŠãããå
šäœãå¿
èŠãšããå Žåãã¯ã©ã€ã¢ã³ãã«äœãåé¡ããããŸãã ããã«ãå¯èœãªéããã©ãããªããŒã¿ãéåžžå¿
èŠã§ãã ãããã¿ã€ãã³ã°æ®µéã§LINQãš
Queryable ExtensionsãŸãã¯
Mapsterã®äœ¿çšãéå§ã§ã
ãŸã ã ãŸããå¿
èŠã«å¿ããŠã
QueryHandler
å®è£
ã
Dapperããã³/ãŸãã¯å¥ã®ããŒã¿ã¹ãã¢ã«çœ®ãæããŸãã Simple Injectorã«ã¯
䟿å©ãªã¡ã«ããºã ããããŸããã¢ã»ã³ããªãããªãŒãã³ãžã§ããªãã¯ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ãããã¹ãŠã®ãªããžã§ã¯ããç»é²ããæ®ãã¯LINQã§ãã©ãŒã«ããã¯ã®ãŸãŸã«ããŠããããšãã§ããŸãã ãã®æ§æãäœæããããç·šéããå¿
èŠã¯ãããŸããã ã¢ã»ã³ããªã«æ°ããå®è£
ã远å ããã ãã§ååã§ãã³ã³ãããèªåçã«ååŸããŸãã ä»ã®ãžã§ããªãã¯ã«ã€ããŠã¯ãLINQå®è£
ã®ãã©ãŒã«ããã¯ãåŒãç¶ãæ©èœããŸãã
Mapster
ã
Mapster
ã§ã¯ããããã³ã°çšã®ãããã¡ã€ã«ãäœæããå¿
èŠã¯ãããŸããã
Entity
ãš
Dto
éã®ããããã£åã®èŠåã«åŸããš
Dto
ãããžã§ã¯ã·ã§ã³ã¯èªåçã«æ§ç¯ãããŸãã
ãèªåããããŒãã§ã¯ã次ã®ã«ãŒã«ããããŸããæåãããã³ã°ãäœæããå¿
èŠããããçµã¿èŸŒã¿ã®åæãååã§ãªãå Žåã¯ãèªåããããŒãªãã§è¡ãããšããå§ãããŸãã ãããã£ãŠãããããã¹ã¿ãŒããžã®ç§»è¡ã¯éåžžã«ç°¡åã§ããããšãããããŸããã
ããªãã¡ ãã©ã³ã¶ã¯ã·ã§ã³ã®éå§ããçµäºãŸã§æå¹ã§ãã ããªãã¡ éåžžã®äœ¿çš-èŠæ±ããšã«1ã€ã®ãã³ãã©ãŒã ããŒã¿ã«ã¢ã¯ã»ã¹ããã«ã¯ããã§ã«èšåãã
QueryObject
ã
UnitOfWork
ãªã©ãä»ã®ã¡ã«ããºã ã䜿çšããããšãã
UnitOfWork
ãŸãã ã¡ãªã¿ã«ãããã¯
Command
ãã
Query
ã䜿çšããåé¡ãšããã®éã®åé¡ã解決ããŸãã
QueryObject
䜿çšããã ãã§ãã ãã®èŠåã«éåãããšããã©ã³ã¶ã¯ã·ã§ã³ã®ç®¡çãšããŒã¿ããŒã¹ãžã®æ¥ç¶ãè€éã«ãªããŸãã
暪æçé¢å¿äºãšãã³ã¬ãŒã¿
CQRSã«ã¯ãæšæºã®ãµãŒãã¹ã¢ãŒããã¯ãã£ããã倧ããªå©ç¹ã1ã€ãããŸããæ±çšã€ã³ã¿ãŒãã§ã€ã¹ã¯2ã€ãããããŸããã ããã«ãããã
decorator ããã³ãã¬ãŒãã®æçšæ§ã倧å¹
ã«é«ããããšãã§ããŸãã ã¢ããªã±ãŒã·ã§ã³ã«ã¯å¿
èŠã§ãããæåéãã®æå³ã§ã¯ããžãã¹ããžãã¯ã§ã¯ãªãå€ãã®é¢æ°ããããŸãããã®ã³ã°ããšã©ãŒåŠçããã©ã³ã¶ã¯ã·ã§ã³æ§ãªã©ã§ãã åŸæ¥ã2ã€ã®ãªãã·ã§ã³ããããŸãã
- ãã®ãããªäŸåé¢ä¿ãšé¢é£ã³ãŒãã䜿çšããŠããžãã¹ããžãã¯ãé
眮ããæŽçããŸãã
- AOPã«ç®ãåããïŒ
Castle.Dynamic Proxy
ãªã©ã®ã©ã³ã¿ã€ã ã¹ãã€ã©ãŒã䜿çšãããã Castle.Dynamic Proxy
ãªã©ã®ã³ã³ãã€ã«æã«ILãæžãæãã
æåã®ãªãã·ã§ã³ã¯ãåé·æ§ãšã³ããŒã¢ã³ãããŒã¹ããæªãã§ãã 2çªç®-ããã©ãŒãã³ã¹ãšãããã°ã®åé¡ãå€éšããŒã«ãžã®äŸåãããã³ãéæ³ãã ãã³ã¬ãŒã¿ä»ããªãã·ã§ã³-äžå€®ã®ã©ããã«ãããŸãã äžæ¹ã§ã¯ããã³ã¬ãŒã¿ã®ä»éããããžãã¯ãåãåºãããšãã§ããŸãã äžæ¹ãéæ³ã¯ãããŸããã ãã¹ãŠã®ã³ãŒãã¯äººã«ãã£ãŠäœæããããããã°ã§ããŸãã
ModelBinderã倿Žããã«å
¥åãã©ã¡ãŒã¿ãŒãæ€èšŒããããšã§åé¡ã解決ããããšãçŽæããŸãããïŒ çãã¯ãæ€èšŒçšã®ãã³ã¬ãŒã¿ãå®è£
ããããšã§ãã äŸå€ã®äœ¿çšã«æ
£ããŠããå Žåã¯ã
ValidationExcepton
ã¹ããŒããŸãã
public class ValidationQueryHandlerDecorator<TQuery, TResult> : IQueryHandler<TQuery, TResult> where TQuery : IQuery<TResult> { private readonly IQueryHandler<TQuery, TResult> decorated; public ValidationQueryHandlerDecorator(IQueryHandler<TQuery, TResult> decorated) { this.decorated = decorated; } public TResult Handle(TQuery query) { var validationContext = new ValidationContext(query, null, null); Validator.ValidateObject(query, validationContext, validateAllProperties: true); return this.decorated.Handle(query); } }
ããã§ãªãå Žåã¯ãå°ããªã©ãããŒãäœæããæ»ãå€ãšããŠ
Resultã䜿çšã§ããŸãã
public class ResultQueryHandler<TSource, TDestination> : IQueryHandler<TSource, Result<TDestination>> { private readonly IQueryHandler<TSource, TDestination> _queryHandler; public ResultQueryHandler(IQueryHandler<TSource, TDestination> queryHandler) { _queryHandler = queryHandler; } public Result<TDestination> Ask(TSource param) => Result.Succeed(_queryHandler.Ask(param)); }
SimpleInjectorã¯ã
ãªãŒãã³ãžã§ããªãã¯ãšãã³ã¬ãŒã¿ã
ç»é²ãã䟿å©ãªæ¹æ³ãæäŸããŸãã 1è¡ã®ã³ãŒãã§ãå®è¡åãå®è¡åŸãã°ããŒãã«ãã©ã³ã¶ã¯ã·ã§ã³ã®ãã³ã°ããšã©ãŒåŠçããã¡ã€ã³ã€ãã³ããžã®èªåãµãã¹ã¯ãªãã·ã§ã³ãèšé²ã§ããŸãã äž»ãªããšã¯ç¡çãããªãããšã§ãã
IQueryHandler
ãš
ICommandHandler
2ã€ã®ã€ã³ã¿ãŒãã§ã€ã¹ã«ã¯äžäŸ¿ãª
IQueryHandler
ãã
ICommandHandler
ã äž¡æ¹ã®ãµãã·ã¹ãã ã§ãã®ã³ã°ãŸãã¯æ€èšŒãæå¹ã«ããã«ã¯ãåãã³ãŒãã§2ã€ã®ãã³ã¬ãŒã¿ãŒãèšè¿°ããå¿
èŠããããŸãã ãŸããããã¯å
žåçãªç¶æ³ã§ã¯ãããŸããã èªã¿åããµãã·ã¹ãã ã§ã¯ããã©ã³ã¶ã¯ã·ã§ã³æ§ãå¿
èŠã«ãªãããšã¯ã»ãšãã©ãããŸããã ããã§ããæ€èšŒãšãã®ã³ã°ã䜿çšããäŸã¯éåžžã«éèŠã§ãã ãã®åé¡ã¯ãã€ã³ã¿ãŒãã§ã€ã¹ããããªã²ãŒãã«ç§»è¡ããããšã§è§£æ±ºã§ããŸãã
public abstract class ResultCommandQueryHandlerDecorator<TSource, TDestination> : IQueryHandler<TSource, Result<TDestination>> , ICommandHandler<TSource, Result<TDestination>> { private readonly Func<TSource, Result<TDestination>> _func;
ã¯ãããã®å Žåãå°ããªãªãŒããŒãããããããŸããã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ããããã©ã¡ãŒã¿ãŒããã£ã¹ãããããã«ã®ã¿ã2ã€ã®ã¯ã©ã¹ã宣èšããå¿
èŠããããŸãã ããã¯IOCã³ã³ããã®æ§æãè€éã«ããããšã§ã解決ã§ããŸããã2ã€ã®ã¯ã©ã¹ã宣èšããæ¹ãç°¡åã§ãã
å¥ã®æ¹æ³ã¯ã
Command
ããã³
Query
IRequestHandler
ã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããæ··ä¹±ãé¿ããããã«åœåèŠåã䜿çšããããšã§ãã ãã®ã¢ãããŒãã¯
MediatRã©ã€ãã©ãªã«å®è£
ãããŠ
ããŸãã