Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
CQRS-¼òµ¥µÄ¼Ü¹¹Éè¼Æ
 
×÷ÕߣºTocy
  1755  次浏览      28
 2020-4-17 
 
±à¼­ÍƼö:
±¾ÎÄÖ÷Òª½²ÊöÁË×î¼òµ¥µÄ CQS ʵÏÖÓëÕæÕý³ÉÊìµÄ CQRS Ö®¼äÓм¸¸ö²½Öè,ËûÃÇÐèÒªÊÊÓ¦µÄ¹æÔò¡£
±¾ÎÄÀ´×ÔÓÚCOSCHINA£¬ÓÉ»ðÁú¹ûÈí¼þAlice±à¼­¡¢ÍƼö¡£

ÓÐÈË˵£º¡°CQRSºÜÄÑ£¡¡±

ÊÇÂ𣿠ºÃ°É£¬ÎÒÒ²ÔøÕâÑùÈÏΪ£¡ µ«£¬µ±ÎÒ¿ªÊ¼Ê¹Óà CQRS ±àдÎҵĵÚÒ»¸öÈí¼þʱ£¬ËüºÜ¿ì¾Í²»¹¥×ÔÆÆ¡£¸üÎªÖØÒªµÄÊÇ£¬ÎÒÈÏΪ´Ó³¤Ô¶À´¿´£¬ÒÔÕâÖÖ·½Ê½Î¬»¤Èí¼þ¸ü¼ÓÈÝÒס£

ÎÒ¿ªÊ¼Ë¼¿¼£ºÎªºÎÈËÃÇÔÚÒ»¿ªÊ¼Ê±ÈÏΪËüÊǶàôÀ§ÄÑÄѺ͸´ÔÓ£¿ ÎÒÓÐÒ»¸öÀíÂÛ£ºËü°üº¬¹æÔò£¡ ½øÈëÓµÓйæÔòµÄÊÀ½ç×ÜÊDz»Êæ·þµÄ£¬ÎÒÃÇÐèÒªÊÊÓ¦ÕâЩ¹æÔò¡£ÔÚÕâÆªÎÄÕÂÖУ¬ÎÒÏëÖ¤Ã÷ÔÚÕâÖÖÇé¿öÏ£¬ÕâЩ¹æÔòÊǷdz£Ò×ÓÚÀí½âµÄ¡£

ÔÚͨÍù CQRS µÄ·ÉÏ¡­

´Ó¸ù±¾ÉÏÀ´Ëµ£¬ÎÒÃÇ¿ÉÒÔ½« CQRS ÊÓΪ¶ÔÈí¼þ¼Ü¹¹ÃüÁî²éѯ·ÖÀë¹æÔòµÄʵÏÖ¡£ÔÚʹÓô˷½·¨µÄ¹¤×÷ÖУ¬ÎÒ×¢Òâµ½ÔÚ×î¼òµ¥µÄ CQS ʵÏÖÓëÕæÕý³ÉÊìµÄ CQRS Ö®¼äÓм¸¸ö²½Öè¡£ÎÒÏëÄÇЩ²½Öè¿ÉÒÔ˳ÀûµØÒýÈëÎÒ֮ǰÒѾ­Ìáµ½µÄ¹æÔò¡£

ËäÈ»µÚÒ»²½Ã»ÓÐʵÏÖÎÒ¶Ô CQRS µÄ¶¨Ò壨µ«ÊÇÓÐʱºòÕâô³ÆºôµÄ£©£¬µ«ÊÇËûÃÇ»¹¿ÉÒÔΪÄãµÄÈí¼þÒýÈëÒ»Ð©ÕæÕýµÄ¼ÛÖµ¡£Ã¿¸ö²½Öè¶¼ÒýÈëһЩÓÐȤµÄÏë·¨£¬¿ÉÒÔÓÐÖúÓÚ¹¹½¨»òÇåÀíÄãµÄ´úÂë¿â/¼Ü¹¹¡£

ͨ³££¬ÎÒÃǵÄÂó̴ÓÕâÀ↑ʼ£º

ÎÒÃÇ¿ÉÄܶ¼ÖªµÀ£¬ÕâÊÇÒ»¸öµäÐ굀 N-²ã¼Ü¹¹¡£Èç¹ûÎÒÃÇÏëÔÚÕâÌí¼ÓһЩ CQS£¬ÎÒÃÇ¿ÉÒÔ¡°¼òµ¥µØ¡±½«ÒµÎñÂß¼­²ã·ÖÀëΪÃüÁîºÍ²éѯ£º

Èç¹ûÄ㻹ÔÚʹÓÃÀÏʽ´úÂë¿â£¬Õâ¿ÉÄÜÊÇ×îÄѵÄÒ»²½£¬¾ÍÏñ´ÓÒâ´óÀûÃæÊ½´úÂëÖÐÔĶÁ·ÖÀë³ö¸±×÷ÓÃÒ»Ñù²»¼òµ¥¡£Í¬Ê±Õâ¸ö²½Öè¿ÉÄÜÒ²ÊÇ×îÓкô¦µÄÒ»¸ö£»Ëü»á¸øÄãÒ»¸ö¸±×÷ÓÃÖ´ÐеÄλÖõĸÅÊö¡£

µÈһϣ¡ÄãÕýÔÚÌÖÂÛ CQS£¬CQRS £¬µ«ÊÇÄ㻹ûÓж¨Òåµ½µ×ʲôÊÇÃüÁî»ò²éѯ£¡

û´í¡£ÎÒÃÇ¿ªÊ¼¶¨ÒåËüÃǰɣ¡ÔÚÕâÀÎÒ»á¸øÄãÎÒ¸öÈË¡¢Ö±¹ÛµÄ¶ÔÃüÁîºÍ²éѯµÄ¶¨Òå¡£Ëü²¢²»È«Ã棬¶øÇÒÔÚʵÏÖ֮ǰ±ØÐë¼ÓÒÔÉ¡£

ÃüÁ¡ªÊ×ÏÈ£¬´¥·¢ÃüÁîÊÇΨһ¸Ä±äϵͳ״̬µÄ·½·¨¡£ÃüÁÔðÒýÆðËùÓеĶÔϵͳµÄ¸Ä±ä¡£Èç¹ûûÓÐÃüÁϵͳ״̬±£³Ö²»±ä£¡ÃüÁî²»Ó¦¸Ã·µ»ØÈκÎÖµ¡£ÎÒʹÓÃÁ½¸öÀàÀ´ÊµÏÖËü£ºCommand ºÍ CommandHandler ¡£Command Ö»ÊÇÒ»¸öÆÕͨµÄ¶ÔÏó£¬CommandHandler ½«ËüÓÃÓÚ±íʾijЩ²Ù×÷µÄÊäÈëÖµ£¨²ÎÊý£©¡£ÎÒÈÏΪÃüÁîÊǼòµ¥µØµ÷ÓÃÁìÓòÄ£ÐÍÖеÄÌØ¶¨²Ù×÷£¨²»Ò»¶¨ÊÇÿ¸öÃüÁî¶¼ÓеIJÙ×÷£©¡£

²éѯ¡ª¡ªÍ¬ÑùµÄ£¬²éѯÊÇÒ»¸ö¶Á²Ù×÷¡£Ëü¶ÁȡϵͳµÄ״̬£¬¹ýÂË£¬¾Û×Ü£¬ÒÔ¼°×ª»»Êý¾Ý£¬²¢½«Æäת»¯Îª×îÓÐÓõĸñʽ¡£Ëü¿ÉÒÔÖ´Ðжà´Î£¬¶øÇÒ²»»áÓ°ÏìϵͳµÄ״̬¡£ÎÒ֮ǰÊÇʹÓÃÒ»¸öÓÐһЩ Execute(¡­) º¯ÊýµÄÀàÀ´ÊµÏÖËü£¬µ«ÊÇÏÖÔÚÎÒÈÏΪ·ÖÀë³É Query ºÍ QueryHandler/QueryExecutor ¿ÉÄÜ»á¸üÓÐÓá£

»Øµ½Ê¾Òâͼ£¬ÎÒÐèÒª³ÎÇåһЩÊÂÇ飻ÎÒÒѾ­ÒþÃØµØ×öÁËÒ»¸ö²¹³äÐ޸ģ¬Ä£Ð͸ÄΪÁìÓòÄ£ÐÍ¡£ÓÉÓÚÎÒÈÏΪģÐÍÊÇÒ»×éÊý¾ÝÈÝÆ÷£¬¶øÁìÓòÄ£ÐͰüÀ¨ÁËÒµÎñ¹æÔòÖб¾Öʸ´ÔÓÐÔ¡£ÒòΪÎÒÃǶÔÕâÀïµÄÌåϵ¼Ü¹¹¸ÐÐËȤ£¬Õâ¸öÐ޸IJ»»áÖ±½ÓÓ°ÏìÎÒÃǵĽøÒ»²½¿¼ÂÇ¡£µ«ÊÇÖµµÃÒ»ÌáµÄÊÇ£¬¾¡¹ÜÃüÁÔð¸Ä±äϵͳµÄ״̬£¬±¾Öʸ´ÔÓÐÔÓ¦¸Ã·Åµ½ÁìÓòÄ£ÐÍ¡£

ºÃµÄ£¬ÏÖÔÚÎÒÃÇ¿ÉÒÔÌí¼ÓеÄÃüÁî»òÕß±àдеIJéѯ¡£¶Ìʱ¼äÄÚ£¬ºÜÃ÷ÏÔ£¬ÊÊÓÃÓÚдµÄÁìÓòÄ£ÐͲ¢²»Ò»¶¨Êʺ϶Á¡£´ÓijÖÖÌØÊâÄ£ÐÍÖиüÈÝÒ×¶ÁÈ¡Êý¾Ý£¬Õâ²¢²»ÊÇÒ»¸öÖØ´óµÄ·¢ÏÖ£º

ÎÒÃÇ¿ÉÒÔÒýÈë·ÖÀëÄ£ÐÍ£¬ÓÉ ORM Ó³Éä²¢¹¹½¨²éѯ£¬µ«ÊÇÔÚijЩÇé¿öÏ£¬ÌرðÊǵ± ORM ÒýÈ뿪Ïúʱ£¬Ëü½«¶Ô¼ò»¯½á¹¹ÓÐËù°ïÖú¡£

ÎÒÈÏΪÕâ¸öÌØÊâµÄ¸Ä±äÓ¦µ±±»ºÃºÃµØ¿¼ÂÇ£¡

ÏÖÔÚµÄÎÊÌâÊÇÎÒÃÇÈÔÈ»ÓнöÔÚÂß¼­²ã¼¶ÉÏ·ÖÀëµÄ¶ÁºÍдģÐÍ£¬ÒòΪËûÃǹ²Ïí¹«¹²Êý¾Ý¿â¡£Õâ¾ÍÒâζ×ÅÎÒÃÇÒѾ­·ÖÀëÁ˶ÁÄ£ÐÍ£¬µ«×îÓпÉÄÜÊDZ»Ò»Ð© DB ÊÓͼ¸øÐéÄ⻯ÁË£¬ÎﻯÊÓͼµÄÇé¿öϸüºÃ¡£Èç¹ûÎÒÃǵÄϵͳûÓÐÐÔÄÜÎÊÌ⣬²¢ÇÒÎÒÃǼÇסÔÚдģÐ͸ıäµÄʱºò¸üвéѯ£¬ÄÇÕâ¸ö·½°¸ÊÇ¿ÉÐеġ£

ÏÂÒ»²½ÊÇÒýÈëÍêÈ«·ÖÀëµÄÊý¾ÝÄ£ÐÍ£º

ÔÚÎÒ¿´À´£¬ÕâÊǵÚÒ»¸ö·ûºÏ Greg Young Ìá³öµÄԭʼÏë·¨µÄÄ£ÐÍ£¬ÏÖÔÚÎÒÃdzÆËüΪ CQRS ¡£µ«ÊÇËüÈÔÈ»ÓÐÎÊÌ⣡ÎÒÖ®ºóÔÙд¡£

CQRS != ʼþËÝÔ´

ʼþËÝÔ´ÊÇÓë CQRS Ò»ÆðÌá³öµÄÒ»¸ö¸ÅÄͨ³£±»±êʶΪ CQRS µÄÒ»²¿·Ö¡£ES£¨Event Sourcing£©µÄ¸ÅÄîºÜ¼òµ¥£ºÎÒÃǵÄÁìÓòÉú³ÉµÄʼþ±íʾϵͳÖеÄÿһ¸ö¸ü¸Ä¡£Èç¹ûÎÒÃÇ´Óϵͳ¿ªÊ¼¼Ç¼ÿһ¸öʼþ£¬¶øÇÒ´Ó×î³õ״̬¿ªÊ¼ÖØÏÖ£¬ÎÒÃÇ»áµÃµ½ÏµÍ³µÄµ±Ç°×´Ì¬¡£ËüÓëÒøÐÐÕË»§µÄÊÂÎñÏàËÆ£»ÎÒÃÇ¿ÉÒÔ´Ó¿ÕÕË»§¿ªÊ¼£¬ÖØÏÖÿһ¸öµ¥¶ÀµÄÊÂÎñ£¬È»ºó£¨ÓÐÏ£ÍûµØ£©µÃµ½µ±Ç°µÄÓà¿î¡£Òò´Ë£¬Èç¹ûÎÒÃÇÒѾ­´æ´¢ÁËËùÓеÄʼþ£¬ÎÒÃÇÄܵõ½ÏµÍ³µÄµ±Ç°×´Ì¬¡£

ËäÈ» ES ÊǴ洢ϵͳµÄ״̬µÄÒ»Öֺܺõķ½·¨£¬µ«ÊÇ CQRS ²¢²»Ò»¶¨ÐèÒªËü¡£¶ÔÓÚ CQRS £¬ÁìÓòÄ£ÐÍʵ¼ÊÉÏÈçºÎ´æ´¢²¢²»ÖØÒª£¬¶øÇÒÕâÖ»ÊÇÒ»¸öÑ¡Ïî¡£

¶ÁÄ£ÐͺÍдģÐÍ

µ±ÎÒÃÇÔĶÁ CQRS ʱ£¬·ÖÀëÄ£Ð͵ĸÅÄîËÆºõ·Ç³£ÇåÎúºÍÖ±½Ó£¬µ«ÔÚʵÏÖ¹ý³ÌÖÐËÆºõ²¢²»Çå³þ¡£Ð´Ä£Ð͵ÄÔðÈÎÊÇʲô£¿ÎÒÊÇ·ñÓ¦¸Ã½«ËùÓÐÊý¾Ý·ÅÈëÎҵĶÁȡģÐÍÖУ¿àÅ£¬ÕâµÃ¿´Çé¿ö£¡

дģÐÍ

ÎÒϲ»¶°ÑÎÒµÄд×÷Ä£ÐÍ¿´×÷ÊÇϵͳµÄºËÐÄ¡£ÕâÊÇÎÒµÄÁìÓòÄ£ÐÍ£¬Ëü×öÒµÎñ¾ö²ß£¬ËüºÜÖØÒª¡£Ëü×ö³öÒµÎñ¾ö²ßµÄÊÂʵÔÚÕâÀïÊÇÖÁ¹ØÖØÒªµÄ£¬ÒòΪËü¶¨ÒåÁËÕâ¸öÄ£Ð͵ÄÖ÷ÒªÖ°Ôð:Ëü´ú±íϵͳµÄÕæÊµ×´Ì¬£¬¿ÉÒÔÓÃÀ´×ö³öÓмÛÖµµÄ¾ö²ßµÄ״̬¡£ÕâÖÖģʽÊÇΨһµÄÕæÀíÀ´Ô´¡£

Èç¹ûÄãÏëÁ˽â¸ü¶à¹ØÓÚÉè¼ÆÁìÓòÄ£Ð͵Ä֪ʶ£¬ÎÒÍÆ¼öÄãÔĶÁÁìÓòÇý¶¯Éè¼Æ¼¼ÊõÕÜѧ¡£

¶ÁÄ£ÐÍ

ÔÚÎÒµÚÒ»´Î³¢ÊÔ CQRS ʱ£¬ÎÒʹÓÃÁË WRITE Ä£ÐÍÀ´¹¹½¨²éѯ¡­¡­ËüÊÇ OK µÄ(»òÕßÖÁÉÙÊÇÓÐЧµÄ)¡£¹ýÁËÒ»¶Îʱ¼ä£¬ÎÒÃǵ½´ïÁËÏîÄ¿ÖÐÐèÒª»¨·Ñ´óÁ¿Ê±¼ä½øÐвéѯµÄµØ·½¡£ÎªÊ²Ã´?ÒòΪÎÒÃÇÊdzÌÐòÔ±£¬ÓÅ»¯ÊÇÎÒÃǵĵڶþÌìÐÔ¡£ÎÒÃǽ«Ä£ÐÍÉè¼ÆÎª¹æ·¶»¯£¬Òò´ËÎÒÃǵĶÁÈ¡¶ËÊܵ½Á¬½ÓµÄÓ°Ïì¡£ÎÒÃDZ»ÆÈÔ¤ÏȼÆËãһЩ±¨¸æµÄÊý¾ÝÒÔ±£³Ö¿ìËÙ¡£ÕâºÜÓÐȤ£¬ÒòΪʵ¼ÊÉÏÎÒÃÇÒýÈëÁË»º´æ¡£ÔÚÎÒ¿´À´£¬ÕâÊǶÁȡģÐ͵Ä×î¼Ñ¶¨Òå:ËüÊÇÒ»¸öºÏ·¨µÄ»º´æ¡£ÓÉÓÚÎÒÃDZØÐë·¢²¼ÏîÄ¿£¬¶ø·Ç¹¦ÄÜÐÔµÄÐèÇóûÓеõ½Âú×㣬Òò´Ë£¬»º´æÊÇͨ¹ýÉè¼ÆÀ´ÊµÏֵġ£

±êÇ©¶ÁȡģÐÍ¿ÉÒÔ½¨ÒéËü´æ´¢ÔÚÒ»¸öÊý¾Ý¿âÖУ¬½ö´Ë¶øÒÑ¡£Êµ¼ÊÉ϶ÁȡģÐÍ¿ÉÄܷdz£¸´ÔÓ£¬Äã¿ÉÒÔʹÓÃͼÐÎÊý¾Ý¿âÀ´´æ´¢Éç»áÁ¬½Ó£¬Ê¹Óà RDBMS À´´æ´¢²ÆÎñÊý¾Ý¡£ÕâÊÇÒ»¸ö¶àÓïÑÔ³Ö¾ÃÐÔºÜ×ÔÈ»µÄµØ·½¡£

Éè¼ÆºÃµÄ¶ÁÄ£ÐÍÊÇһϵÁеÄȨºâ£¬ÀýÈç´¿¹æ·¶»¯Óë´¿·Ç¹æ·¶»¯¡£Èç¹ûÄãµÄÏîÄ¿ºÜС£¬²¢ÇÒ´ó¶àÊý¶ÁÈ¡¶¼¿ÉÒÔ¸ù¾ÝдģÐÍÓÐЧµØ½øÐУ¬ÄÇô´´½¨¸±±¾½«ÀË·Ñʱ¼äºÍ¼ÆËãÄÜÁ¦¡£µ«ÊÇ£¬Èç¹ûÄãµÄдģÐÍÊÇ×÷ΪһϵÁÐʼþ´æ´¢µÄ£¬ÄÇôʹÓÃËùÓбØÐèµÄÊý¾Ý¶ø²»´ÓÍ·ÖØÐ²¥·ÅËùÓÐʼþ½«ÊǷdz£ÓÐÓõġ£Õâ¸ö¹ý³Ì½Ð×ö¿ìËÙ¶ÁÈ¡ÅÉÉú£¬ÔÚÎÒ¿´À´£¬ËüÊÇ CQRS ÖÐ×ÔӵĶ«Î÷Ö®Ò»£¬ÕâÊÇÎÒÇ°ÃæÌáµ½µÄÒ»¸öÄѵ㡣ÕýÈçÎÒ֮ǰËù˵£¬¶ÁÄ£ÐÍÊÇ»º´æµÄÒ»ÖÖÐÎʽ£¬ÕýÈçÎÒÃÇËùÖª£º

ÔÚ¼ÆËã»ú¿ÆÑ§ÖÐÖ»ÓÐÁ½¼þÀ§ÄѵÄÊÂÇé:»º´æÊ§Ð§ºÍÃüÃû¡£ ¡ª¡ªPhil Karlton

ÎÒ˵ËüÊÇÒ»¸ö¡°ºÏ·¨¡±µÄ»º´æ£¬Õâ¸ö´Ê¶ÔÎÒÀ´ËµÒ²ÓжîÍâµÄÒâÒ壬ÔÚÎÒÃǵÄϵͳÖУ¬ÎÒÃÇÓÐÃ÷ÏÔµÄÀíÓɸüлº´æ¡£ÎÒÃǵÄÓòÄ£ÐͲúÉúµÄʼþÊǸüжÁÄ£Ð͵Ä×ÔȻԭÒò¡£

×îÖÕÒ»ÖÂÐÔ

Èç¹ûÎÒÃǵÄÄ£ÐÍÔÚÎïÀíÉÏÊÇ·Ö¿ªµÄ£¬ÄÇôͬ²½½«ÐèҪһЩʱ¼ä£¬ÕâÊǺÜ×ÔÈ»µÄ£¬µ«ÊÇÕâÒ»´Î¶ÔÒµÎñÈËÔ±À´ËµÊǷdz£¿Éŵġ£ÔÚÎÒµÄÏîÄ¿ÖУ¬Èç¹ûÿ¸ö²¿·Ö¶¼Õý³£¹¤×÷£¬ÄÇô READ model ²»Í¬²½µÄʱ¼äͨ³£¿ÉÒÔºöÂÔ²»¼Æ¡£È»¶ø£¬ÔÚ¿ª·¢¸ü¸´ÔÓµÄϵͳʱ£¬ÎÒÃǿ϶¨ÐèÒª¿¼ÂÇʱ¼ä·çÏÕ¡£Éè¼ÆÁ¼ºÃµÄ UI ¶ÔÓÚ´¦Àí×îÖÕµÄÒ»ÖÂÐÔÒ²ºÜÓаïÖú¡£

ÎÒÃDZØÐë¼ÙÉ裬¼´Ê¹¶ÁȡģÐÍÓëдÈëÄ£ÐÍͬ²½¸üУ¬Óû§ÈÔÈ»»á¸ù¾Ý³Â¾ÉµÄÊý¾Ý×ö³ö¾ö²ß¡£²»ÐÒµÄÊÇ£¬ÎÒÃDz»ÄÜÈ·¶¨µ±Êý¾Ý³ÊÏÖ¸øÓû§Ê±ËüÊÇ·ñÈÔÈ»ÐÂÏÊ£¨±ÈÈçÔÚ web ä¯ÀÀÆ÷ÖгÊÏÖ)¡£

ÈçºÎ½« CQRS ÒýÈëµ½ÏîÄ¿ÖУ¿

ÎÒÏàÐÅ CQRS Èç´Ë¼òµ¥£¬²»ÐèÒªÒýÈëÈκοò¼Ü¡£Äã¿ÉÒÔ´ÓÉÙÓÚ100ÐдúÂëµÄ×î¼òµ¥µÄʵÏÖ¿ªÊ¼£¬È»ºóµ±ÐèÒªµÄʱºòÔÙÒýÈëÐÂÌØÐÔÀ´À©Õ¹Ëü¡£Äã²»ÐèÒªÈκÎħ·¨£¬ÒòΪ CQRS ºÜ¼òµ¥£¬¶øÇÒËü¼ò»¯ÁËÈí¼þ¡£ÕâÊÇÎÒµÄʵÏÖ£º

public interface ICommand
{
}
public interface ICommandHandler
where TCommand : ICommand
{
void Execute(TCommand command);
}
public interface ICommandDispatcher
{
void Execute(TCommand command)
where TCommand : ICommand;
}

ÎÒ¶¨Ò弸¸ö½Ó¿ÚÃèÊöÃüÁîºÍËûÃǵÄÖ´Ðл·¾³¡£ÎªÊ²Ã´ÎÒÓÃÁ½¸ö½Ó¿ÚÀ´¶¨ÒåÒ»ÌõÃüÁÎÒÕâô×öÊÇÒòΪÎÒÏëÒª±£³Ö²ÎÊýΪÆÕͨ¶ÔÏó£¬ÕâÑù¾Í¿ÉÒÔ²»ÓÃÈκÎÒÀÀµÀ´´´½¨¡£ÎÒµÄÃüÁî handler ¿ÉÒÔ´Ó DI ÈÝÆ÷ÖÐÇëÇóÒÀÀµ£¬¶øÇÒ³ýÁËÔÚ²âÊÔÖУ¬²»ÐèÒªÔÚÈκεط½ÊµÀý»¯¡£ÊÂʵÉÏ£¬ICommand ½Ó¿ÚÔÚÕâµÄ×÷ÓÃÏ൱ÓÚ±ê¼Ç£¬À´¸æËß¿ª·¢ÕßËûÊÇ·ñ¿ÉÒÔ½«Õâ¸öÀà×÷ΪÃüÁîÀ´Ê¹Óá£

public interface IQuery
{
}
public interface IQueryHandler
where TQuery : IQuery
{
TResult Execute(TQuery query);
}
public interface IQueryDispatcher
{
TResult Execute(TQuery query)
where TQuery : IQuery;
}

´Ë¶¨Òå·Ç³£ÀàËÆ IQuery ½Ó¿Ú£¬µ«Ëü»¹¶¨ÒåÁ˲éѯ½á¹ûµÄÀàÐÍ¡£ Õâ²»ÊÇ×îÓÅÑŵĽâ¾ö·½°¸£¬µ«½á¹ûÊÇÔÚ±àÒëʱУÑé·µ»ØµÄÀàÐÍ¡£

public class CommandDispatcher : ICommandDispatcher
{
private readonly IDependencyResolver _resolver;
public CommandDispatcher(IDependencyResolver resolver)
{
_resolver = resolver;
}
public void Execute(TCommand command)
where TCommand : ICommand
{
if(command == null)
{
throw new ArgumentNullException("command");
}
var handler = _resolver.Resolve>();
if (handler == null)
{
throw new CommandHandlerNotFoundException(typeof(TCommand));
}
handler.Execute(command);
}
}

ÎÒµÄ CommandDispatcher Ï൱¶Ì£¬ËüÖ»¸ºÔðΪ¸ø¶¨µÄÃüÁîʵÀý»¯Êʵ±µÄÃüÁîÖúÊÖ²¢Ö´ÐÐËü¡£ÎªÁ˱ÜÃâÊÖ¶¯ÊäÈëÃüÁîÈ¥×¢²áºÍʵÀý»¯£¬ÎÒÒѾ­Ê¹ÓÃÁË DI ÈÝÆ÷À´×öÕâ¼þÊ£¬µ«Èç¹ûÄã²»ÏëʹÓÃÈκΠDI ÈÝÆ÷£¬ÄãÈÔÈ»¿ÉÒÔ×Ô¼º×ö¡£ÎÒ˵¹ý£¬Õâ¸öʵÏÖ½«ÊǼòµ¥µÄ£¬ÎÒÏàÐÅÊÇÕâÑù¡£Î¨Ò»µÄÎÊÌâ¿ÉÄÜÊÇ·ºÐÍÒýÈëµÄÔëÒô£¬Ëü¿ÉÄܸտªÊ¼µÄʱºò»áÁîÈ˾ÚÉ¥¡£Õâ¸öʵÏÖÔÚʹÓÃÉÏȷʵÊǼòµ¥µÄ¡£ÏÂÃæÊÇÒ»¸öÃüÁîºÍÖúÊÖµÄʾÀý£º

public class SignOnCommand : ICommand
{
public AssignmentId Id { get; private set; }
public LocalDateTime EffectiveDate { get; private set; }

public SignOnCommand(AssignmentId assignmentId, LocalDateTime effectiveDate)
{
Id = assignmentId;
EffectiveDate = effectiveDate;
}
}
public class SignOnCommandHandler : ICommandHandler
{
private readonly AssignmentRepository _assignmentRepository;
private readonly SignOnPolicyFactory _factory;
public SignOnCommandHandler(AssignmentRepository assignmentRepository,
SignOnPolicyFactory factory)
{
_assignmentRepository = assignmentRepository;
_factory = factory;
}
public void Execute(SignOnCommand command)
{
var assignment = _assignmentRepository.GetById(command.Id);
if (assignment == null)
{
throw new MeaningfulDomainException("Assignment not found!");
}
var policy = _factory.GetPolicy();

assignment.SignOn(command.EffectiveDate, policy);
}
}

Ö»ÐèÒª½« SignOnCommand ´«¸ø·ÖÅÉÆ÷À´Ö´ÐÐÕâ¸öÃüÁ

_commandDispatcher.Execute(new SignOnCommand(new AssignmentId(rawId), effectiveDate));

¾ÍÊÇÕâÑù¡£QueryDispatcher ¿´ÆðÀ´ºÜÏàËÆ£¬Î¨Ò»²»Í¬ÊÇËü·µ»ØÁËһЩÊý¾Ý£¬¶à¿÷ÁËÎÒ֮ǰдµÄͨÓôúÂ룬Execute ·½·¨·µ»ØÇ¿ÀàÐͽá¹û£º

public class QueryDispatcher : IQueryDispatcher
{
private readonly IDependencyResolver _resolver;
public QueryDispatcher(IDependencyResolver resolver)
{
_resolver = resolver;
}
public TResult Execute(TQuery query)
where TQuery : IQuery
{
if (query == null)
{
throw new ArgumentNullException("query");
}
var handler = _resolver.Resolve>();
if (handler == null)
{
throw new QueryHandlerNotFoundException(typeof(TQuery));
}
return handler.Execute(query);
}
}

¾ÍÏñÎÒ˵µÄ£¬Õâ¸öʵÏÖÊÇ¿ÉÒÔÀ©Õ¹µÄ¡£ÀýÈ磬ÎÒÃÇ¿ÉÒÔΪÃüÁî dispatcher ÒýÈëÊÂÎñ£¬¶øÎÞÐèͨ¹ý´´½¨ decorator À´¸Ä±äԭʼʵÏÖ¡£

public class TransactionalCommandDispatcher : ICommandDispatcher
{
private readonly ICommandDispatcher _next;
private readonly ISessionFactory _sessionFactory;
public TransactionalCommandDispatcher(ICommandDispatcher next,
ISessionFactory sessionFactory)
{
_next = next;
_sessionFactory = sessionFactory;
}
public void Execute(TCommand command)
where TCommand : ICommand
{
using (var session = _sessionFactory.GetSession())
using (var tx = session.BeginTransaction())
{
try
{
_next.Execute(command);
tx.Commit();
}
catch
{
tx.Rollback();
throw;
}
}
}
}

ͨ¹ýʹÓÃÕâ¸öα·½·¨£¬ÎÒÃÇ¿ÉÒÔÇáËɵØÀ©Õ¹ÃüÁîºÍ²éѯ·ÖÅÉÆ÷¡£Äã¿ÉÒÔÌí¼Ó¡°¼´·¢¼´Æú¡±µÄÃüÁîÖ´Ðз½·¨ºÍ´óÁ¿ÈÕÖ¾¡£

ÕýÈçÄã¿´µ½µÄ£¬CQRS ûÄÇôÄÑ£¬»ù±¾µÄ˼ÏëºÜÇåÎú£¬µ«ÊÇÄãÐèÒª×ñÊØÒ»Ð©¹æÔò¡£ÎÒÈ·ÐÅÕâÆªÎÄÕÂûÓк­¸ÇÈ«²¿µÄÄÚÈÝ£¬Õâ¾ÍÊÇÎÒ½¨ÒéÄã¶à¶ÁһЩµÄÔ­Òò¡£

   
1755 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕÂ

ΪʲôҪ×ö³ÖÐø²¿Êð£¿
ÆÊÎö¡°³ÖÐø½»¸¶¡±£ºÎå¸öºËÐÄʵ¼ù
¼¯³ÉÓë¹¹½¨Ö¸ÄÏ
³ÖÐø¼¯³É¹¤¾ßµÄÑ¡Ôñ-×°ÔØ
 
Ïà¹ØÎĵµ

³ÖÐø¼¯³É½éÉÜ
ʹÓÃHudson³ÖÐø¼¯³É
³ÖÐø¼¯³ÉÖ®-ÒÀÀµ¹ÜÀí
IPD¼¯³É²úÆ·¿ª·¢¹ÜÀí
Ïà¹Ø¿Î³Ì

ÅäÖùÜÀí¡¢ÈÕ¹¹½¨Óë³ÖÐø¼¯³É
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
µ¥Ôª²âÊÔ¡¢Öع¹¼°³ÖÐø¼¯³É
»ùÓÚAndroidµÄµ¥Ôª¡¢ÐÔÄܲâÊÔ
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]
 
×îÐÂÎÄÕÂ
iPersonµÄ¹ý³Ì¹Û£ºÒª ¹ý³Ì or ½á¹û
¡°ÒÔÈËΪ±¾¡±µÄ¹¤³ÌÕÜѧ
ÆóÒµ¼Ü¹¹¡¢TOGAFÓëArchiMate¸ÅÀÀ
UML ͼ½â£ºË³Ðòͼ£¨ sequence diagram £©
UML ͼ½â£º¶ÔÏóͼ£¨ class diagram £©
×îпγÌ
»ùÓÚUMLºÍEA½øÐÐϵͳ·ÖÎöÉè¼Æ
UML+EA+ÃæÏò¶ÔÏó·ÖÎöÉè¼Æ
»ùÓÚSysMLºÍEA½øÐÐϵͳÉè¼ÆÓ뽨ģ
UML + ǶÈëʽϵͳ·ÖÎöÉè¼Æ
ÁìÓòÇý¶¯µÄ½¨Ä£ÓëÉè¼Æ
³É¹¦°¸Àý
ijµçÐÅÔËÓª¹©Ó¦ÉÌ Ó¦ÓÃUML½øÐÐÃæÏò¶ÔÏó·ÖÎö
·é»ðͨÐÅ UML½øÐÐÃæÏò¶ÔÏóµÄ·ÖÎöÉè¼Æ
Î÷ÃÅ×Ó UMLÓëǶÈëʽÈí¼þ·ÖÎöÉè¼Æ
º½Ìì¿Æ¹¤Ä³×Ó¹«Ë¾ ´Óϵͳµ½Èí¼þµÄ·ÖÎö¡¢Éè¼Æ
ÉîÛÚijÆû³µÆóÒµ Ä£ÐÍÇý¶¯µÄ·ÖÎöÉè¼Æ