±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½²ÊöÁË×î¼òµ¥µÄ
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 ûÄÇôÄÑ£¬»ù±¾µÄ˼ÏëºÜÇåÎú£¬µ«ÊÇÄãÐèÒª×ñÊØÒ»Ð©¹æÔò¡£ÎÒÈ·ÐÅÕâÆªÎÄÕÂûÓк¸ÇÈ«²¿µÄÄÚÈÝ£¬Õâ¾ÍÊÇÎÒ½¨ÒéÄã¶à¶ÁһЩµÄÔÒò¡£ |