ããã«ã¡ã¯ã
CQRSã§ãã®èšäºãæžããŠãããŠããããšãã ç§ã¯å®è£
ãã©ã®ããã«èŠããããç解ããããšããŠããŠãäŸã調ã¹ãŠããŸããã äŸã§æäŸãããŠãããµã³ãã«ãªããžããªã³ãŒãã¯ãåœåèŠåãé€ããŠãéåžžã®ãªããžããªã®èšè¿°æ¹æ³ãšéåžžã«ãã䌌ãŠããŸãã ããšãã°ã以äžã«ç€ºããªããžããªã¯ProductsCommandHandler
ãšåãã ãšæããŸããããããã1ã€ã®éãã¯ãéåžžã¯è¿œå ããGetProduct
ãããã«ãªãããšã§ãã ç§ãããã«æ¥ãŠããªãããšã説æããŠããããŸããïŒ
public class ProductRepository {
void AddNewProduct(Product newProduct) {
...
}
void RateProduct(int productId, int userId, int rating) {
var product = repository.Find(productId);
if (product != null)
{
product.RateProduct(userId, rating);
repository.Save(product);
}
}
}
â ãã®ã»ã¯ã·ã§ã³ã¯ç·šéããªãã§ãã ããã
@martinmthomasã質åããããšãããããŸãïŒ å¿ èŠã«å¿ããŠãæŽæ°ã確èªããŠæäŸããŸãã
@MikeWassonããã§äœãèãã¯ãããŸããïŒ
ABïŒ160217-å ±åããŠããã ãããããšãããããŸã-ãã®åé¡ã¯å¯©æ»äžã§ã
@martinmthomaså®éãã³ãã³ããã³ãã©ãŒã¯ãªããžããªã§ã¯ãããŸããã ãªããžããªã䜿çšããŸãã
ã³ãã³ããã³ãã©ã¯ããé©åãªå Žåãå®éã®ã³ãã³ããåŠçãããããšãç®çãšããŠããŸãã ãã®äŸã§ã¯ã ProductsCommandHandler
ã¯ã©ã¹ã¯ã³ã³ã¹ãã©ã¯ã¿ãŒã§IRepository<Product>
ãåãåããŸãã
ãŠãŒã¶ãŒã補å5555ã4ã€æã«è©äŸ¡ãããšããŸãã
{"product":"5555","stars":4}
ã䜿çšããŠã«ãŒã/ã¬ãŒãã«ç§»åããAJAXPOSTãããªã¬ãŒãããšããŸããRateProduct
ãäœæãã補å5555ãæ4ãå
¥åããŸãããã®äŸã§ã¯ã誰ãè©äŸ¡ããŠããããå
¥åããŸããCommandHandler
ãååŸãïŒããããäŸåæ§æ³šå
¥ã«ãã£ãŠïŒãããã«ã³ãã³ããé
眮ããã ãã§ããh.HandleïŒcïŒ; ããã§ãcã¯RateProductã³ãã³ãã§ãããããã£ãŠã3ã€ã®ãªãã·ã§ã³ïŒaïŒãã³ãã©ãŒãååŸãããbïŒãã¥ãŒãååŸãããcïŒãã¹ãååŸããã³ãã³ãããã³ãã©ãŒãŸãã¯ãã¥ãŒã«éä¿¡ããããšã決å®ãããŸãã
ã©ã®ãããªã¢ãããŒãããšã£ãŠã...ãåŸæ¥ã®ãªããžããªãã®äž»ãªéãã¯ãã³ã³ãããŒã©ã§ãªããžããªèªäœãåŒã³åºããªãããšã§ãã ã³ã³ãããŒã©ã¯ããšã³ãã£ãã£ã®ç®¡çæ¹æ³ãïŒåŸæ¥ã®ãªããžããªïŒãèªèããŠããŸããããããšã³ãã£ãã£ã«å¯ŸããŠè¡ãããšã®æå³ã管çããæ¹æ³ãïŒã³ãã³ããã³ãã©ïŒãèªèããŠããŸãã
次ã«ãã€ã³ãã³ããšããŠéä¿¡ãããã®ã¯ããã®ååã瀺ãããã«ãã©ããïŒhtml Webã³ã³ãããŒã©ãŒãAPIã³ã³ãããŒã©ãŒãã³ãã³ãã©ã€ã³ãªã©ïŒããéä¿¡ããããã³ãã³ããåŠçãããã³ãã³ããã³ãã©ãŒã§ãããCommandHandlerã§ãã ïŒæžã蟌ã¿åŽã«å±ããŸãïŒãã®ã³ãã³ããã©ããããã決å®ããŸãã
ããšãã°ãCommandHandlerã¯ãªããžããªã䜿çšããŠè£œåãååŸããç¶æ ãèšå®ããŠä¿åã§ããŸããïŒäŸã®ããã«ïŒãã€ãã³ããã°ã«æžã蟌ãã ããèŠçŽ ãããªã¬ãŒããŠèªã¿åãåŽãæŽæ°ããããå€éšã³ãã¯ã¿ãããªã¬ãŒãããããããšãã§ããŸãã
補åãšãã®ã³ã³ãããŒã©ãŒããäž»æŒ/è©äŸ¡ã·ã¹ãã ãé 眮ãŸãã¯ä¿åãããŠãããå Žæããäžå¯ç¥è«çã«è©äŸ¡ããããã®ãŠãŒã¶ãŒã®ã¿ã¹ã¯ããŒã¹ã®UIã ã·ã¹ãã ãæåããèšèšããProductã¯ã©ã¹ã«äŸã®ããã«RateProductïŒïŒã¡ãœããããã§ã«å«ãŸããŠãããšããŸãã è¯ãã
ããã...補åãžã®ãå€ããã¢ãããŒããåããã¬ã¬ã·ãŒã·ã¹ãã ãããå Žåã¯ã©ãã§ããããã ãã¢ãã«ãïŒã€ãŸããããžãã¹ãã€ã³ãïŒã«ã¯ã補åã®ãè©äŸ¡ãã¯ãããŸããã 代ããã«ãããŒã±ãã£ã³ã°æ åœè ã¯æ¢åã®è£œåã«è©äŸ¡ããè¿œå ãããããšèããŠããŸããããã¹ãŠã®äŒç€Ÿã¯ããããå€éšã®ãã®ãã§ããããšã«åæããŠããŸãã 補åãªããžããªã䜿çšããŸããïŒ ãŸãã¯ãå¥ã®ãã«ããŒã¹ãã¬ãŒãžã䜿çšããŠããã§ã«æ©èœããååã«ãã¹ããããProductããã³ProductRepositoryã«ã觊ããªããããã«ããŸããïŒ
ã³ãã³ãã䜿çšããå Žåã¯ãæžã蟌ã¿ã³ã³ãããŒã©ãŒãæ°ã«ããŸããã WebãAPIãããã³CLIã¯ãã¹ãŠããã³ãã³ãããã³ãã³ããã³ãã©ãŒã«ïŒçŽæ¥ããã¥ãŒãä»ããŠããŸãã¯ãã³ãã©ãŒãŸãã¯ãã¥ãŒã«é çªã«ã«ãŒãã£ã³ã°ããã³ãã³ããã¹ãä»ããŠïŒéä¿¡ããã ãã§ãå¿ããŠããŸããŸãã 次ã«ãã³ãã³ããã³ãã©ãŒã¯ããœãŒã¹ã³ãŒãã®éäžåãããå°ããªãã€ã³ãã§ãRateProductCommandããã©ã®ããã«åŠçãããã決å®ããŸããããã«ããããããåŠçããæ¹æ³ãã¢ããªã±ãŒã·ã§ã³ã³ãŒãããåãé¢ãããä¿å®æ§ãåäžããŸãã
次ã«ããã³ãã©ãŒã¯ãProductRepositoryãŸãã¯ãã®ä»ã®ã¢ãããŒãã䜿çšããŠã補åã®è©äŸ¡ããä¿åããã®ãé©åãã©ãããå€æããŸãã
ã ãããçããããã«ïŒ
CommandHandler =>ãšã³ãã£ãã£ãšã¯äœã®é¢ä¿ããããŸããã ããã¯ããŠãŒã¶ãŒã®æå³ããåŠçããŸãïŒæçµçã«ã¯ãšã³ãã£ãã£ãå€æŽããå¯èœæ§ããããããããããã³ãã³ããã³ãã©ãŒã¯ãªããžããªã䜿çšããŸãïŒã
ãªããžããª=>ç¹å®ã®ãšã³ãã£ãã£ã®å®éã®ã¹ãã¬ãŒãžã
å©ããŠãããããšãé¡ã£ãŠããŸãã
ã·ã£ãã
@xmonteroãè¿°ã¹ãããã«ãProductsCommandHandlerãšProductRepositoryã«ã¯ãhasãé¢ä¿ãããããŸããã ProductsCommandHandlerã¯ãProductApi / ControllerãšProductRepositoryã®éã®ã€ã³ã¿ãŒãã§ã€ã¹ãšããŠæ©èœããŸãã ãã®å®è£ ã¯ãã³ãã³ããã¯ãšãªããåé¢ããŠããã®ã«åœ¹ç«ã¡ãŸãã åŸæ¥ã®ã¢ãããŒãã§ã¯ãã³ãã³ããšã¯ãšãªãäžç·ã«å®è¡ãç¶ããã³ã³ãããŒã©ãŒããã®ãªããžããªãçŽæ¥äœ¿çšãããããéã«ä»ã®ã€ã³ã¿ãŒãã§ã€ã¹ã¯å¿ èŠãããŸããã
ã³ãã³ããã¯ãšãªããåé¢ãããŸãŸã«ããŠãããšãã¢ããªã±ãŒã·ã§ã³ã«CQRSãã¶ã€ã³ãã¿ãŒã³ãé©çšãããŸãã èšäºã«èšèŒãããŠããCQRSã®ãã¹ãŠã®å©ç¹ãåŸãæ¹åã«é²ã¿ãŸãã
æãåèã«ãªãã³ã¡ã³ã
@martinmthomaså®éãã³ãã³ããã³ãã©ãŒã¯ãªããžããªã§ã¯ãããŸããã ãªããžããªã䜿çšããŸãã
ã³ãã³ããã³ãã©ã¯ããé©åãªå Žåãå®éã®ã³ãã³ããåŠçãããããšãç®çãšããŠããŸãã ãã®äŸã§ã¯ã
ProductsCommandHandler
ã¯ã©ã¹ã¯ã³ã³ã¹ãã©ã¯ã¿ãŒã§IRepository<Product>
ãåãåããŸãããŠãŒã¶ãŒã補å5555ã4ã€æã«è©äŸ¡ãããšããŸãã
{"product":"5555","stars":4}
ã䜿çšããŠã«ãŒã/ã¬ãŒãã«ç§»åããAJAXPOSTãããªã¬ãŒãããšããŸããRateProduct
ãäœæãã補å5555ãæ4ãå ¥åããŸãããã®äŸã§ã¯ã誰ãè©äŸ¡ããŠããããå ¥åããŸããCommandHandler
ãååŸãïŒããããäŸåæ§æ³šå ¥ã«ãã£ãŠïŒãããã«ã³ãã³ããé 眮ããã ãã§ããh.HandleïŒcïŒ; ããã§ãcã¯RateProductã³ãã³ãã§ãããããã£ãŠã3ã€ã®ãªãã·ã§ã³ïŒaïŒãã³ãã©ãŒãååŸãããbïŒãã¥ãŒãååŸãããcïŒãã¹ãååŸããã³ãã³ãããã³ãã©ãŒãŸãã¯ãã¥ãŒã«éä¿¡ããããšã決å®ãããŸãã
ã©ã®ãããªã¢ãããŒãããšã£ãŠã...ãåŸæ¥ã®ãªããžããªãã®äž»ãªéãã¯ãã³ã³ãããŒã©ã§ãªããžããªèªäœãåŒã³åºããªãããšã§ãã ã³ã³ãããŒã©ã¯ããšã³ãã£ãã£ã®ç®¡çæ¹æ³ãïŒåŸæ¥ã®ãªããžããªïŒãèªèããŠããŸããããããšã³ãã£ãã£ã«å¯ŸããŠè¡ãããšã®æå³ã管çããæ¹æ³ãïŒã³ãã³ããã³ãã©ïŒãèªèããŠããŸãã
次ã«ãã€ã³ãã³ããšããŠéä¿¡ãããã®ã¯ããã®ååã瀺ãããã«ãã©ããïŒhtml Webã³ã³ãããŒã©ãŒãAPIã³ã³ãããŒã©ãŒãã³ãã³ãã©ã€ã³ãªã©ïŒããéä¿¡ããããã³ãã³ããåŠçãããã³ãã³ããã³ãã©ãŒã§ãããCommandHandlerã§ãã ïŒæžã蟌ã¿åŽã«å±ããŸãïŒãã®ã³ãã³ããã©ããããã決å®ããŸãã
ããšãã°ãCommandHandlerã¯ãªããžããªã䜿çšããŠè£œåãååŸããç¶æ ãèšå®ããŠä¿åã§ããŸããïŒäŸã®ããã«ïŒãã€ãã³ããã°ã«æžã蟌ãã ããèŠçŽ ãããªã¬ãŒããŠèªã¿åãåŽãæŽæ°ããããå€éšã³ãã¯ã¿ãããªã¬ãŒãããããããšãã§ããŸãã
補åãšãã®ã³ã³ãããŒã©ãŒããäž»æŒ/è©äŸ¡ã·ã¹ãã ãé 眮ãŸãã¯ä¿åãããŠãããå Žæããäžå¯ç¥è«çã«è©äŸ¡ããããã®ãŠãŒã¶ãŒã®ã¿ã¹ã¯ããŒã¹ã®UIã ã·ã¹ãã ãæåããèšèšããProductã¯ã©ã¹ã«äŸã®ããã«RateProductïŒïŒã¡ãœããããã§ã«å«ãŸããŠãããšããŸãã è¯ãã
ããã...補åãžã®ãå€ããã¢ãããŒããåããã¬ã¬ã·ãŒã·ã¹ãã ãããå Žåã¯ã©ãã§ããããã ãã¢ãã«ãïŒã€ãŸããããžãã¹ãã€ã³ãïŒã«ã¯ã補åã®ãè©äŸ¡ãã¯ãããŸããã 代ããã«ãããŒã±ãã£ã³ã°æ åœè ã¯æ¢åã®è£œåã«è©äŸ¡ããè¿œå ãããããšèããŠããŸããããã¹ãŠã®äŒç€Ÿã¯ããããå€éšã®ãã®ãã§ããããšã«åæããŠããŸãã 補åãªããžããªã䜿çšããŸããïŒ ãŸãã¯ãå¥ã®ãã«ããŒã¹ãã¬ãŒãžã䜿çšããŠããã§ã«æ©èœããååã«ãã¹ããããProductããã³ProductRepositoryã«ã觊ããªããããã«ããŸããïŒ
ã³ãã³ãã䜿çšããå Žåã¯ãæžã蟌ã¿ã³ã³ãããŒã©ãŒãæ°ã«ããŸããã WebãAPIãããã³CLIã¯ãã¹ãŠããã³ãã³ãããã³ãã³ããã³ãã©ãŒã«ïŒçŽæ¥ããã¥ãŒãä»ããŠããŸãã¯ãã³ãã©ãŒãŸãã¯ãã¥ãŒã«é çªã«ã«ãŒãã£ã³ã°ããã³ãã³ããã¹ãä»ããŠïŒéä¿¡ããã ãã§ãå¿ããŠããŸããŸãã 次ã«ãã³ãã³ããã³ãã©ãŒã¯ããœãŒã¹ã³ãŒãã®éäžåãããå°ããªãã€ã³ãã§ãRateProductCommandããã©ã®ããã«åŠçãããã決å®ããŸããããã«ããããããåŠçããæ¹æ³ãã¢ããªã±ãŒã·ã§ã³ã³ãŒãããåãé¢ãããä¿å®æ§ãåäžããŸãã
次ã«ããã³ãã©ãŒã¯ãProductRepositoryãŸãã¯ãã®ä»ã®ã¢ãããŒãã䜿çšããŠã補åã®è©äŸ¡ããä¿åããã®ãé©åãã©ãããå€æããŸãã
ã ãããçããããã«ïŒ
CommandHandler =>ãšã³ãã£ãã£ãšã¯äœã®é¢ä¿ããããŸããã ããã¯ããŠãŒã¶ãŒã®æå³ããåŠçããŸãïŒæçµçã«ã¯ãšã³ãã£ãã£ãå€æŽããå¯èœæ§ããããããããããã³ãã³ããã³ãã©ãŒã¯ãªããžããªã䜿çšããŸãïŒã
ãªããžããª=>ç¹å®ã®ãšã³ãã£ãã£ã®å®éã®ã¹ãã¬ãŒãžã
å©ããŠãããããšãé¡ã£ãŠããŸãã
ã·ã£ãã