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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
³õ̽ÁìÓòÇý¶¯Éè¼Æ--Ϊ¸´ÔÓÒµÎñ¶øÉú
 
×÷ÕߣºJesse Liu£¬À´Ô´£º²©¿ÍÔ° ·¢²¼ÓÚ£º2014-12-10
  2632  次浏览      27
 

¸ÅÊö

ÁìÓòÇý¶¯Éè¼ÆÒ²¾ÍÊÇ3D£¨Domain-Driven Design)ÒѾ­ÓÐÁË10ÄêµÄÀúÊ·£¬ÎÒÏàÐźܶàÈË»ò¶à»òÉÙ¶¼Ìý˵¹ýÕâ¸öÃû´Ê£¬µ«ÊÇÓжàÉÙÈËÕæÕý¶®µÃÈçºÎÈ¥ÔËÓÃËü£¬»òÕß°ÑËüÔËÓúÃÄØ£¿ÓÚÊÇÓÐÈË˵£¬DDDºÍTDDÕâÐ©ÍæÒâÊÇһЩÐζøÉϵĶ«Î÷£¬Ö»ÊÇÒ»²èÓà·¹ºóµÄ̸×Ê£¬ÓÖ»òÊǷŵ½¼òÀúÉÏÌáÉý±Æ¸ñ¶øÒÑ¡£Ç°ÃæÕâ¾ä»°ÎÒдÍêÖ®ºóÓÌÔ¥ÁË£¬ÓÌÔ¥Òª²»Òª°ÑËüɾµô£¬ÒòΪËüÈÃÎÒ¿´ÆðÀ´Ïñ¸öÅç×Ó£¬ÎÒȷʵ¸Ðµ½²»½â£¬ÎªÊ²Ã´±ðÈË10Äêǰ´´Ôì×ܽá³öÀ´µÄ¶«Î÷£¬ÎÒÃÇÔÚ10ÄêÖ®ºó¶ÔËüµÄÀí½â»¹´¦ÓÚÕâôµÍµÄÒ»¸ö²ã´Î¡£¿ªÆª¾Í˵ԶÁË£¬ÎÒÒ²ÊÇ×î½ü²Å¿ªÊ¼ÈÏÕæÑ§Ï°ÁìÓòÇý¶¯Éè¼Æ£¬²¢Çҵõ½ÁËÔ°×ÓÀïÃænetfocus,Áõ±ê²ÅºÍÌïÔ°ÀïµÄó¬ó°µÄ°ïÖú£¬ÔÚ´ËÔٴαíʾ¸Ðл¡£Ï£ÍûÄܺʹó¼ÒÒ»Æð°ÑDDDÆÕ¼°ÏÂÈ¥¡£

ÎÒÃÇ֮ǰÓÐÒ»¸ö¹ØÓÚÁìÓòÇý¶¯Éè¼ÆµÄÌÖÂÛ£¬ÁíÍâdax.netÒ²ÓÐÒ»¸ö¹ØÓÚÁìÓòÇý¶¯Éè¼ÆµÄϵÁÐдµÃ²»´í£¬ÓÐÐËȤµÄͬѧ¿ÉÒÔ¿´¿´¡£±¾ÎÄ»áÒÔÒ»¸ö³õѧÕߵĽǶÈÀ´½²½âDDD£¬ÈÃÎÒÃÇÒ»ÇдÓÁ㿪ʼ£¬ÎÒÏàÐÅÄã¸úÎÒÒ»ÑùÒ²»á°®ÉÏËüµÄ¡£

±¾ÆªÖ÷ÒªÌÖÂÛÒ»ÏÂΪʲôÎÒÃÇÒªÓÃDDD£¬ËüÄܹ»ÎªÎÒÃÇ´øÀ´Ê²Ã´£¿

Ò»µã·Ï»° £¬ÎÒÃÇÐèÒªºÃµÄÉè¼ÆÃ´£¿

µ±ÎÒÃÇѧϰһЩÉè¼ÆÄ£Ê½»òÕß¿ò¼ÜµÄʱºò£¬×ÜÓÐÈË»áÕ¾³öÀ´ºÍÄã˵¡°ÕâЩ¶¼Ã»ÓÐÓã¬Ö»ÒªÄÜʵÏÖ¹¦ÄܾÍÐÐÁË¡£¡± ÔÚÕâÀï²¢·ÇÕë¶Ôij¸öÈË£¬Êµ¼ÊÉÏÎÒÈÏΪËûÃÇ˵µÄÊǶԵģ¬ÔÚ×ÊÔ´ÓÐÏÞµÄÇé¿öÏ£¬ÎÒÃÇΪÁËÍê³ÉÏîÄ¿µÄ½»¸¶£¬ÕâÊÇÎÒÃÇ×îºÃµÄÑ¡Ôñ¡£µ«ÊDZðÍüÁË£¬Ç·ÏµÄÕ®×ÜÊÇÒª»¹µÄ£¬ÒÔʵÏÖ¹¦ÄÜΪµ¼ÏòµÄÏîÄ¿Îñ±Ø»áÔì³Éά»¤ÐԵĴó´ó½µµÍ£¬Èç¹ûÖ»ÊÇÒ»¸öÁÙÊ±Ëæ±ãÓÃÓõĶ«Î÷µ¹ÊÇ¿ÉÒÔÒ»ÊÔ£¬µ«Èç¹ûÊÇÒª³¤ÆÚ½øÐиüеIJúÆ·£¬ÄǺóÆÚ¾Í»áÍϸòúÆ·µÄºóÍÈ¡£

ÎÒÃÇÍŶÓÏÖÔÚά»¤×ÅÒ»¸öÓÐ×Å20¶àÄêÀúÊ·µÄ²úÆ·£¬¸Ã²úÆ·ÊÇÒ»¸ö¾Æµê¡¢²ÍÒûÐÐÒµµÄPOSϵͳ£¬ÔÚÃÀ¹úºÍÑÇÌ«µØÇø¶¼Õ¼ÓÐ×űȽϴóµÄÊг¡·Ý¶î¡£¸Ã²úÆ·´ÓC£¬C++£¬VB6һ·¸üУ¬Ö±µ½ÏÖÔÚµÄC#£¬µ«ÊǺܿÉϧ²»ÊÇÕûÌåÌæ»»£¬¶øÊǾֲ¿µÄ£¬ËùÒÔÏÖÔÚÏîÄ¿ÀïÃæÕâ4ÖÖ´úÂëÈ«¶¼ÓС£¿ÉÄÜÄã»á¾õµÃÕâÍæµÄÊÇ»ì´î£¬Êdz±Á÷£¬µ«ÊÂʵÊÇ£¬Ò»µ©²úÆ·ÉÏÏßÖ®ºó£¬»áÓкܶàµÄй¦ÄÜ£¬ÀÏbugµÈÔÚÄÇÀÔÙ¼ÓÉÏ¡°ÖØÊг¡Çá¼¼Êõ¡±µÄ¸ß²ãÔÚÄÇÀïÖÆ¶©Õ½ÂÔ£¬Äãѹ¸ù¾ÍûÓÐʱ¼ä»òÕßûÓжàÉÙʱ¼äÈ¥ÖØ¹¹¡£ÈÕ»ýÔÂÀÛ£¬µÈ×ÅÄãµÄ¾ÍÊÇÿһ´Î¸Ä´úÂë¶¼ÈçÂı¡±ù£¬Ò»²»Ð¡ÐľÍÒòΪ¸ÄÒ»¸öbug¶øÕû³öºÃ¼¸¸öÐÂbug³öÀ´£¬Ç°²»¾ÃÎÒÃÇΪÁËа汾µÄ·¢²¼¾ÍÍ£ÏÂËùÓпª·¢µÄÈÎÎñ£¬´ó¼Ò¼¯Ì廨ÁË1¸öÔµÄʱ¼äÈ¥×ö»Ø¹é²âÊÔÁË¡£ÒòΪǰÆÚ·¢²¼Ð°汾֮ºóbugÌ«¶à£¬ËùÒÔÕâ´ÎÀÏ´óÃǶ¼²»¸ÒÇáÒ×·¢²¼ÁË¡£:)

ÕâÊÇÎÒÃÇѪµÄ½Ìѵ£¬Èç¹ûÄãǰÆÚÖ»¹Ë¿ª·¢¹¦ÄÜ£¬×îºó¾Í»áÈÃÄãºÜÄÑÔÙ¿ª·¢Ð¹¦ÄÜ¡£ËùÒÔÕæ³ÏµÄÏ£Íû´ó¼Ò²»ÒªÔÙÆ¬ÃæµÄ˵¡°Ö»ÒªÊµÏÖ¹¦ÄܾͿÉÒÔÁË£¡¡±£¬Èí¼þ¿ª·¢µÄÁìÓòÕâô´ó£¬ÎÒÃÇûÓбØÒª°Ñ×Ô¼º¾ÖÏÞÔÚijһ¸ö¿ò¿òÀïÃæ¡£¶ÔÓÚ´óÐÍϵͳÀ´Ëµ£¬ÎÒÃÇҪѧϰµÄµØ·½»¹Óкࣺܶ

1.×éÖ¯Á¼ºÃ¡¢¿ÉÔĶÁÐԸߵĴúÂë¿ÉÒÔÈÃÆäËü¿ª·¢ÈËÔ±ºÜÈÝÒ׵ĿªÊ¼È¥Ð޸ĴúÂë¡£

2.µÍñîºÏ£¬¸ßÄÚ¾Û - ÊʺÏÔËÓÃÉè¼ÆÄ£Ê½ÒÔ¼°Ô­ÔòÀ´Éè¼ÆÒ»Ð©ºÃµÄ¿ò¼Ü¿ÉÒÔ½µµÍÐ޸ĴúÂëÒý·¢ÐÂbugµÄ·çÏÕ¡£

3.Á¼ºÃµÄµ¥Ôª²âÊÔÒÔ¼°¼¯³É²âÊÔ¿ÉÒÔ¼°Ê±µÄ°ïÖúÎÒÃǼì²âÐÂÔö»òÐ޸ĵĴúÂëÊÇ·ñ»áÆÆ»µÔ­ÓеÄÂß¼­¡£

4.×Ô¶¯»¯²âÊÔ¾ø¶ÔÊÇʡʱʡÁ¦µÄºÃ°ïÊÖ£¬Ò²ÊÇÏîÄ¿ÖÊÁ¿µÄ±£Ö¤¡£

5.³ÖÐø¼¯³É¿ÉÒÔ°ïÖúÎÒÃǸü¿ìËÙ°²È«µÄ½øÐеü´ú¡£

ÉÏÃæËµÁËÕâô¶àҲûÓÐÌáµ½DDD£¬ÄÇôΪʲôËüÄܹ»ÔÚ¹¹½¨¸´ÔÓϵͳµÄʱºòÓÐÓÅÊÆÄØ£¿ÎÒÃÇ¿ÉÒÔ´ÓÒÔϼ¸¸öµãȥ˼¿¼£º

1.´ÓÉè¼Æ½×¶Î³ö·¢£¬Õ¾ÔÚÒµÎñµÄ½Ç¶È˼¿¼ÎÊÌâ

2.ÀåÇåÒµÎñÖ÷´Î

3.¶ÀÁ¢ÁìÓòÒµÎñ²ã£¬´òͨ¿ª·¢ºÍ²âÊÔ½×¶Î

4.¸É¾»µÄ´úÂë

´ÓÉè¼Æ½×¶Î¿ªÊ¼£¬Õ¾ÔÚÒµÎñµÄ½Ç¶È˼¿¼ÎÊÌâ

³ýÁËDDD£¬ÏÖÔÚ»¹Á÷ÐÐÁíÍâÒ»¸ö´Ê»ãTDD¡£µ«ÊDz»ÖªµÀ´ó¼ÒÓÐûÓÐ×¢Òâµ½DDD£¨Domain-Driven Design)ÖеÄD´ú±í×ÅÉè¼Æ£¬¶øTDD(Test-Driven Development)ÖеÄD´ú±í×Å¿ª·¢£¬ÄãÓÐûÓÐÔø¼¸ºÎʱ°ÑÁìÓòÇý¶¯Éè¼ÆËµ³ÉÁìÓòÇý¶¯¿ª·¢ÄØ£¿µ±È»ÎÒÃÇȷʵÊÇ¿ÉÒÔ¸ù¾ÝÁìÓòÇý¶¯À´¿ª·¢£¬µ«ÊÇDDD±»Éè¼Æ³öÀ´µÄÍêÃÀ³õÖÔÈ´ÊÇÉè¼Æ¡£TDDÇ¿µ÷µÄÒѾ­ÊÇ¿ª·¢ÁË£¬ÒªÇ󿪷¢ÈËÔ±ÏÈдµ¥Ôª²âÊÔÈ»ºóÔÙͨ¹ý²»¶ÏµÄµü´úÖØ¹¹Èõ¥Ôª²âÊÔͨ¹ý£¬ÒÔ´ËÀ´ÊµÏÖ¹¦ÄÜ¡£ÕâÑù×öµÄºÃ´¦ÊÇÇ¿ÆÈÈÿª·¢ÈËÔ±Çå³þÕýÈ·µÄÀí½âÐèÇó£¬ÒªÖªµÀÕâÄêͷûÓÐÕýÈ·Àí½âÐèÇó¾Í¿ªÊ¼Ð´´úÂëµÄ³ÌÐòÔ±´óÓÐÈËÔÚ£¬²¢ÇÒÎÒ²»ÈÏΪÐèÇó¾ÍÊÇÒµÎñ£¬ÐèÇóÒѾ­Êǽ«±¾À´µÄÒµÎñÀí½âÖ®ºó£¬×ª»¯ÎªÁËͨ¹ý¼ÆËã»ú¿ÉÒÔʵÏÖµÄһЩ¹¦Äܶ¨Ò壬ͨ³£ÊÇÒµÎñ·ÖÎöʦ»òÕßÏîÄ¿¾­Àí»áÈ¥Íê³ÉÕâ¸ö¹¤×÷¡£¶øDDDÖеÄD£¨ÁìÓò£©¸üÏñÊDZ¾À´µÄÒµÎñ£¬ËùÒÔÔÚÁìÓòÇý¶¯Éè¼ÆµÄʱºò£¬¿ª·¢ÈËÔ±»òÕ߼ܹ¹Ê¦Ö±½ÓÓëÁìÓòר¼Ò£¨»òÕß˵¿Í»§£©½øÐйµÍ¨À´½¨Ä££¬ÕâЩҵÎñÄ£ÐÍÒ²ÊÇÒԺ󿪷¢ÈËÔ±½øÐÐÉè¼ÆºÍʵÏÖµÄÒÀ¾Ý¡£

ÁìÓòÄ£Ðͱ»µ±×÷¿ª·¢ÈËÔ±Ö®¼ä£¬¿ª·¢ÈËÔ±ÓëÁìÓòר¼ÒÖ®¼ä¹µÍ¨µÄÇÅÁº£¬ÕâÑù¿ÉÒÔ±ÕÃ⿪·¢ÈËÔ±ÓôíÎóµÄ·½Ê½È¥ÊµÏÖ¹¦ÄÜ¡£Êµ¼ÊÉϺܶàÓÅÐãµÄ¿ª·¢ÈËÔ±£¬¶¼»áºÜ×ÔÈ»µÄ½«ÏÖʵÊÀ½çÖеÄÎÊÌâ½øÐгéÏó£¬È»ºóÓüÆËã»úµÄÓïÑÔ±íʾ³öÀ´£¬ÎÒÃdzÆÖ®ÎªÃæÏò¶ÔÏó¡£µ«ÊÇÓÉÓÚȱÉÙÇ×ÁÙÆä¾³µÄÌåÑ飬ÍùÍù»áÀëÕæÊµµÄÒµÎñÄ£ÐÍÓÐһЩ¾àÀë¡£

ÎÒÃǾÙÒ»¸öÀý×ÓÀ´ËµÃ÷Ò»ÏÂÕâ¸öÎÊÌ⣬¼ÙÈçÎÒÃÇÒª¿ª·¢Ò»¸öµç×ÓÉÌÎñµÄÍøÕ¾£¬Õâ¸öÐèÇóÒѾ­·Ç³£Çå³þÁË£¬ÏÖÔÚÄÇô¶àµÄµç×ÓÉÌÎñÍøÕ¾Ö±½ÓÕÕ³­Ò»¸ö¾Í¿ÉÒÔÁË¡£ÏÖÔÚÎÒÃÇÀ´×öÒ»¸öϵ¥µÄ¹¦ÄÜ£¬À´¿´¿´ÔõôȥʵÏÖ ¡£

×÷Ϊһ¸ö¸ß¼¶³ÌÐòÔ±£¬ÎÒÃǵÃÓÃÃæÏò¶ÔÏóµÄ·½Ê½È¥¿ª·¢£¬ÏȽ¨Àà¡£ÓÚÊÇÎÒÃÇÓÐÁËÓû§£¬¶©µ¥£¬¶©µ¥ÏîµÄÀ࣬Óû§´´½¨¶©µ¥È»ºóÍù¶©µ¥ÀïÃæÌí¼ÓÉÌÆ·£¬Ìí¼Ó¶©µ¥ÏîµÄʱºòΪÁË·½±ã£¬ÎÒÃÇÖ»ÐèÒª´«Èë²úÆ·IDºÍÊýÁ¿¾Í¿ÉÒÔÁË£¬ÓÚÊÇOrderÀàÓÐÒ»¸öAddItemµÄ·½·¨¡£

×÷Ϊһ¸ö¸ß¼¶³ÌÐòÔ±£¬Ò»¿´Õâͼ¸Ð¾õºÜÍêÃÀ£¬ÓÐľÓУ¿ ºÃ£¬ÏÂÃæ¿ªÊ¼ÊµÏÖAddItem·½·¨¡£

OrderÀïÃæÊÇÒ»¸öOrderItemµÄ¼¯ºÏ£¬¶øÕâ¸öAddItemµÄ·½·¨½ÓÊÕµÄÊÇproductId£¬ÎÒÈ¥ÄÄÀï¸ã¸öProduct¶ÔÏó¸øÄ㣿ÎÒ²»¿ÉÄÜÔÚÕâ¸öʵÌåÀïÃæÖ±½ÓÈ¥²éÊý¾Ý¿â°É£¿±¾À´Êdzå×ÅÕâ¸ö¼¼ÊõµãÏë×ÉѯһÏ´ó¼Ò£¬ºóÀ´ÔÚС×éÀïÃæÌÖÂÛÁËһϣ¬ÎÒ»ÐÈ»´óÎò£¬ÉÏÃæµÄʵÌå¾ÍÊÇÎÒ´Ó´úÂëµÄ²ãÃæÈ¥Ë¼¿¼Ïë³öÀ´µÄ£¬Ïµ¥Âµ±È»ÊÇÓû§£¬¶©µ¥ºÍ¶©µ¥Ïîà¶¡£¿ÉÊÇÖ»ÒªÈ¥ÍøÉÏÂò¹ý¶«Î÷¶¼ÖªµÀ£¬Óû§ÊDz»»áÖ±½ÓÍù¶©µ¥ÀïÃæ¼Ó¶«Î÷µÄ£¬¶øÊÇÏȰÑÉÌÆ·¼ÓÈ빺Îï³µ£¬È»ºóÔÙͨ¹ý¡°½áË㡱һ´ÎÐԾ͸ù¾Ý¹ºÎï³µÉú³ÉÁËÒ»ÕŶ©µ¥£¬Ñ¹¸ùûÓÐÍù¶©µ¥ÀïÃæÌí¼Ó¶©µ¥ÏîµÄÐÐΪ¡£Õâ²ÅÊÇÕæÕýµÄÓû§ÐÐΪ£¨ÁìÓòÂß¼­£©ËùÒÔºóÀ´£¬ÎÒÃǵÄʵÌå±ä³ÉÕâÑùÁË£º

ËùÒÔÒµÎñÊÇÕâÑùµÄ£º

δע²áÓû§Ò²¿ÉÒÔ½«ÉÌÆ·Ìí¼Óµ½¹ºÎï³µÖУ¬µ«ÊDz»ÄÜ϶©µ¥¡£

²¢ÇÒ¹ºÎï³µÖеÄÉÌÆ·²»Äܱ£´æÆðÀ´£¬Óû§À뿪Õâ¸öÍøÕ¾£¨Ò»°ãÊǹصôä¯ÀÀÆ÷£©£¬¹ºÎï³µÖеÄÉÌÆ·¾Í»áÏûʧ¡£

×¢²áÓû§¹ºÎï³µÖеÄÉÌÆ·¿ÉÒÔ³¤ÆÚÓÀ¾Ã±£´æ£¬Í¨¹ý¹ºÎï³µµÄ¡°½áË㹦ÄÜ¡±£¬½«¹ºÎï³µÖÐÑ¡ÖеÄÉÌÆ·×ª»¯Îª¶©µ¥¡£

ËùÒÔ¹ºÎï³µ£¬Ó¦¸ÃÔÚÓû§×¢²áµÄʱºò¾ÍÓ¦¸Ã´´½¨ºÃ£¬¶ÔÓ¦ÎÒÃÇÉÏÃæµÄUserʵÌåÖеÄCreatShoppingCart()·½·¨¡£ÏÂÃæÎÒÃÇÏÈÀ´¼òµ¥ÊµÏÖÒ»ÏÂ×¢²áµÄ´úÂë¡£

//UserÁìÓòʵÌå´úÂë

namespace RepositoryAndEf.Domain
{
    public class User : BaseEntity
    {
        public string Name { get; set; }
        public string Email { get; set; }
        public string Password { get; set; }
        public Guid ShoppingCartId { get; set; }
        public virtual ShoppingCart ShoppingCart { get; set; }
        public virtual ICollection Orders { get; set; }

        public void CreateShoppingCart()
        {
            ShoppingCart = new ShoppingCart
            {
                Id = Guid.NewGuid(),
                Customer = this,
                CustomerId = Id,
            };

            ShoppingCartId = ShoppingCart.Id;
        }
    }
}

//ÁìÓò²ã UserService.cs´úÂë

namespace RepositoryAndEf.Domain
{
    public class UserService
    {
        private IRepository _userRepository;

        public UserService(IRepository userRepsoitory)
        {
            _userRepository = userRepsoitory;
        }

        public virtual User Register(string email, string name, string password)
        {
            var user = new User
            {
                Id = Guid.NewGuid(),
                Email = email,
                Name = name,
                Password = password
            };

            user.CreateShoppingCart();
            _userRepository.Insert(user);
            return user;
        }
    }
}

//Ó¦Óòã UserService.cs´úÂë

namespace RepositoryAndEf.Service
{
    public class UserService : IUserService
    {
        protected Domain.UserService DomainuUserService
        {
            get
            {
                return EngineContext.Current.Resolve();
            }
        }

        public User Register(string email, string name, string password)
        {
            var user = DomainuUserService.Register(email, name, password);
            return user;
        }
    }
}

ÉÏÃæÊÇÎÒÃÇÒ»´Î½¨Ä£µÄ¹ý³Ì£¬ÊÇÒ»¸ö½«ÒµÎñת±ä³É´úÂ룬½«ÏÖʵÊÀ½ç³éÏó³ÉÈí¼þÊÀ½çµÄ¹ý³Ì¡£ÎÒÃÇÐèÒª»­³öÄ£ÐͲ»¶ÏµÄÓëÒµÎñÈËÔ±£¨ÁìÓòר¼Ò£©È¥¹µÍ¨£¬È»ºó²»¶ÏµÄÖØ¹¹È¥ÍêÉÆÎÒÃǵÄÄ£ÐÍ£¬ÒÔÖÁÓÚÕâ¸öÄ£ÐÍÄÜ×î׼ȷµÄ·´Ó³ÕæÊµµÄÒµÎñ¡£ÕâÊÇÔÚ×ʼµÄÉè¼Æ½×¶Î£¬ÊÇÐèÇó¹µÍ¨½×¶Î¾ÍÐèÒª×öµÄ¹¤×÷£¬²¢ÇÒ»áÒ»Ö±¹á´©ÎÒÃǺóÃæµÄ¿ª·¢ÉõÖÁά»¤½×¶Î£¬Ã»ÓÐÈË¿ÉÒÔÒ»¿ªÊ¼¾Í°ÑÁìÓòÄ£Ðͽ¨µÄ100%׼ȷ£¬ÐèÇóÊǸ´Ôӵ쬲¢ÇÒÐèÇó»¹ÊÇËæÊ±±ä»¯µÄ£¬ËùÒÔÄ£ÐÍÒ²»áÒ»Ö±·¢Éú¸Ä±ä¡£Ëü½«×÷Ϊ¿ª·¢ÈËÔ±ÓëÒµÎñÈËÔ±¡¢²âÊÔÈËÔ±ÒÔ¼°¿ª·¢ÈËÔ±×Ô¼ºÖ®¼ä¹µÍ¨µÄÇÅÁº¡£¶øDDDÓëÆäËü·½·¨ÂÛµÄÇø±ðÖ®´¦¾ÍÔÚÓÚ£¬Ëü»¹ÌṩÁËÒ»ÕûÌ×µÄÌåϵÀ´±£Ö¤ºóÐø¶ÔÁìÓòÄ£Ð͵ÄÖØ¹¹²»»áÈÃϵͳ±äµÃËÄ·ÖÎåÁÑ£¬±ÈÈç¼Ü¹¹·Ö²ã£¬²Ö´¢£¬ÒÀÀÁ×¢ÈëµÈµÈ£¬ÎÒÃǺóÃæÔÙÂýÂý̽ÌÖ¡£

ÔÚDDDÖУ¬ÁìÓòÄ£ÐÍ·ÖΪÈýÖÖ£º

1.ʵÌå

2.Öµ¶ÔÏó

3.ÁìÓò·þÎñ

Çø·ÖʵÌå¡¢Öµ¶ÔÏóºÍÁìÓò·þÎñ

ÎÒÃDz»´òËãÈ¥½âÊÍÒÔÉϵĸÅÄÎÒÏàÐÅÖ»ÒªÄãËÑË÷һϾͿÉÒԵõ½ºÜÈ«Ãæ×¼È·µÄ´ð°¸¡£µ«ÊÇÖØÒªµÄÊÇÎÒÃÇÒ»¶¨ÒªÀí½â3ÕßÖ®¼äµÄÇø±ð£¬Ê²Ã´Ê±ºòÊÇʵÌ壬ʲôʱºòÊÇÖµ¶ÔÏó£¬ÓÖÊÇʲôʱºòÎÒÃǸÃÓÃÁìÓò·þÎñÄØ£¿ÎÒÏëÕâÊǸսӴ¥DDDµÄÈ˶¼ÄÑÃâ»áÓÐЩ¾À½áµÄµØ·½°É£¬ÔÚÕâÀï¾ÍÇ¿µ÷һϡ£

ʵÌåÏà¶ÔÓÚÖµ¶ÔÏó¶øÑÔÓµÓС°±êʶ¡±µÄ¸ÅÄ±êʶ¿ÉÒÔÈÃÎÒÃdzÖÐøÐԵĸú×ÙʵÌå¡£±êʶºÍÊý¾Ý¿âÀïÃæµÄ¡°Ö÷¼ü¡±ÊDz»Ò»ÑùµÄ¸ÅÄÖ÷¼üÊǼ¼ÊõÉϵĸÅÄµ«ÊDZêʶÊÇÒµÎñÉϵĸÅÄî¡£

ÔÚÎÒÃÇÉÏÃæµÄÀý×ÓÖÐÓû§IDÊDZêʶ£¬ÎÒÃÇÓÃËüÀ´³ÖÐøÐԵĸú×ÙÎÒÃǵÄÓû§¡£¶©µ¥IDÊDZêʶ£¬ÎÒÃÇÓÃËüÀ´³ÖÐøÐԵĸú×Ù¶©µ¥£¬Í¬Ê±ÎÒÃǵÄÓû§ºÍ¶©µ¥¶¼ÊÇÓÐ×Ų»Í¬µÄ״̬¡£µ«ÊǶÔÓÚÓû§µÄµØÖ·À´Ëµ£¬ÎÒÃÇÓÃʲôÀ´×ö±êÊ¶ÄØ£¿ÔÚµç×ÓÉÌÎñÍøÕ¾ÕâÑùµÄÒµÎñÀïÃæ£¬ÎÒÃDz»ÐèҪȥ³ÖÐøµÄ¸ú×ÙÕâ¸öµØÖ·ÐÅÏ¢£¬ËüÔÚÎÒÃǵÄϵͳÀïÃæÒ²²»»áÓÐ×ÅÏñ¶©µ¥´Ó¡°´´½¨¡±¡¢¡°ÒѸ¶¿î¡±¡¢¡°ÒÑ·¢»õ¡±¡¢¡°ÒÑÊÕ»õ¡±µÈÕâÑùµÄ״̬£¬ËùÒÔµØÖ·ÐÅÏ¢µÄÎÒÃÇϵͳÖоÍÊÇÒ»¸öÖµ¶ÔÏó¡£

µ«ÊÇÎÒÃÇÈç¹û»»ÁËÒ»¸öϵͳ£¬±ÈÈç˵ËÀÂýµÄ³¤³Ç¿í´ø£¬ËûÃǰѵØÖ·×÷Ϊ¸ú×Ù¶ÔÏó¡£Í¬Ò»¸öµØÖ·£¬Ë­¶¼¿ÉÒÔÈ¥×¢²á£¬µ«ÊÇͬһ¸öʱ¼äÖ»ÔÊÐíÒ»¸öÈËÈ¥×¢²á£¬ÄÇôÕâ¸öµØÖ·¶ÔÓÚ³¤³Ç¿í´øÀ´Ëµ¾ÍȥҪȥ³ÖÐøÐԵĸú×Ù£¬ÓС°¿ª»§¡±£¬¡°Ïú»§¡±µÄ״̬¡£ÄÇôµØÖ·ÐÅÏ¢¶ÔÓÚ³¤³Ç¿í´øÀ´Ëµ¾ÍÊÇÒ»¸öʵÌå¡£

½â¾öÍêʵÌåºÍÖµ¶ÔÏó£¬ÁìÓò·þÎñ¾ÍºÃ˵ÁË£¬Ò»Ð©ÖØÒªµÄÁìÓò²Ù×÷£¬¼È²»ÊôÓÚʵÌåÒ²²»ÊôÓÚÖµ¶ÔÏó£¬ÄǾͿÉÒÔ°ÑËü·Åµ½·þÎñÖÐÁË¡£±ÈÈç˵ÎÒÃÇÉÏÃæµÄÁìÓò·þÎñUserServiceÀïÃæµÄ×¢²á²Ù×÷£¬×¢²áÕâ¸ö²Ù×÷¿ÉÒÔ˵¾ÍÊǽ«Õâ¸öÓû§±£´æµ½ÎÒÃǵÄϵͳÖС£ÔÚ×¢²áÖ®¼ä£¬Õâ¸öÓû§ÊDz»´æÔڵģ¬ÎÒÃÇÓÖÔõôÄܰÑ×¢²áÕâ¸ö²Ù×÷·Åµ½UserʵÌåÖÐÈ¥ÄØ£¿ËùÒÔ°ÑËü·Åµ½ÁìÓò·þÎñÖгÉÁËÎÒÃÇ×îºÃµÄÑ¡Ôñ¡£

¼´Ê¹ÊÇÕâÑù£¬ÄÄЩ²Ù×÷Ó¦¸Ã·Åµ½ÁìÓò·þÎñÖжÔÓںܶà³õѧÕßÀ´Ëµ»¹ÊÇÒ»¼þ±È½ÏÄÑÑ¡ÔñµÄÎÊÌâ¡£Ò²ÐíÖ»ÓÐÂýÂýµÄ¶ÔÒµÎñÔ½À´Ô½Á˽⣬¶ÔDDDÓ¦ÓõÄÔ½À´Ô½Ê죬ÎÒÃǾͻáÉÙÒ»µã¾À½á¡£

ÀåÇåÒµÎñÖ÷´Î-¾ÛºÏÓë¾ÛºÏ¸ù

ÔÚÉÏÃæµÄÄ£ÐÍÖУ¬ÎÒÃÇÓÐºÜ¶à¹ØÏµµÄ´æÔÚ£ºÓû§-¹ºÎï³µ£¨1¶Ô1£©£¬Óû§-¶©µ¥-¶©µ¥Ïî-²úÆ·£¨1¶Ô¶à£¬1¶Ô1£©£¬¹ºÎï³µ-¹ºÎï³µÏî-²úÆ·µÈ¡£ÔÚDDDÖУ¬ÎÒÃǰÑÕâÑù¶à¸öÄ£ÐÍÓùØÁª´®ÆðÀ´×é³ÉÒ»¸ö¾ÛºÏ(aggregation)¡£

ÔÚÎÒÃǵÄÄ£ÐÍÖУ¬¹ºÎï³µ-¹ºÎï³µÏîÊÇÒ»¸ö¾ÛºÏ£¬¶©µ¥-¶©µ¥ÏîÊÇÒ»¸ö¾ÛºÏ¡£ÎÒÃÇͨ³£ÐèÒª±£»¤ÕâЩ¾ÛºÏµÄÒ»ÖÂÐÔ£¬±ÈÈç˵ÎÒÃǰÑÒ»¸ö¶©µ¥É¾µôÁË£¬ÄÇôÕâ¸ö¶©µ¥µÄ¶©µ¥ÏîÒ²ÐèÒªÒ»Æðɾ³ý£¬·ñÔòËûÃÇ´æÔÚҲûÓÐÈκεÄÒâÒå¡£ÒÔǰÎÒÃÇ»¹»áÓõ½´¥·¢Æ÷£¬µ«ÊÇ´ó¼Ò¶¼ÖªµÀÕâ¸ö¶«Î÷ά»¤ÆðÀ´±È½ÏÂé·³£¬Ð´ÆðÀ´Ò²²»·½±ãµÈ£¬ËùÒÔºóÀ´´ó¼Ò¶¼ÊÇÔÚ´úÂëÖÐÀ´¿ØÖÆ¡£µ«ÊÇһֱûÓÐÒ»¸öºÃµÄÔ¼ÊøËµÎÒÃÇÈçºÎÈ¥¸üºÃµÄ¿ØÖÆÕâЩһÖÂÐÔ£¬´úÂëÒ»Ö±¶¼ºÜÉ¢ÂÒ£¬Ö±µ½DDD£¬ÎÒÃÇÓÐÁ˾ۺϺ;ۺϸùµÄ¸ÅÄ¡°ÎÒÃÇͨ¹ýΪÿһ¸ö¾ÛºÏÑ¡ÔñÒ»¸ö¸ù£¬²¢Í¨¹ý¸ùÀ´¿ØÖÆËùÓжԱ߽çÄڵĶÔÏóµÄ·ÃÎÊ¡£Íⲿ¶ÔÏóÖ»ÄܳÖÓиùµÄÒýÓã»ÓÉÓÚ¸ù¿ØÖÆÁË·ÃÎÊ£¬Òò´ËÎÒÃÇÎÞ·¨ÈƹýËüÈ¥ÐÞ¸ÄÄÚ²¿ÔªËØ¡£ÎÒÃǺóÃæ»¹»á˵µ½Ö»ÄÜΪ¸ùÀ´½¨Á¢Repository£¬ÕâÒ²ÊÇΪÁËÈ·±£ÎÒÃÇÕâÀïÃæ½²µÄÊý¾ÝµÄÒ»ÖÂÐÔ¡£

ÔÚÎÒÃÇÉÏÃæµÄ¾ÛºÏÖУ¬Ö»ÄÜͨ¹ý¹ºÎﳵʵÌåÀ´²Ù×÷¹ºÎï³µÏ¶ø²»ÄÜÄã×Ô¼ºÐ´Ò»¸ö±£´æµÄ·½·¨Ö±½Ó¾Í°Ñ¹ºÎï³µÏî¸ø±£´æµ½Êý¾Ý¿âÖÐÈ¥ÁË¡£Õâ¾ÍÊǾۺϺ;ۺϸùÆðµ½µÄ×÷Óá£ÎÒÃÇÀ´¿´Ò»ÏÂÎÒÃǹºÎﳵʵÌåµÄ´úÂ룺

namespace RepositoryAndEf.Domain
{
    public class ShoppingCart : BaseEntity
    {
        public ShoppingCart()
        {
            Items = new List();
        }

        #region Properties

        public Guid CustomerId { get; set; }
        public virtual User Customer { get; set; }
        public virtual ICollection Items { get; set; }

        #endregion

        #region Methods
        public void AddItem(Product product, int quantity)
        {
            // Èç¹û¸Ã²úÆ·IDÒѾ­´æÔÚÓÚ¹ºÎï³µÖУ¬ÎÒÃÇÖ±½Ó¸ü¸ÄÊýÁ¿¼´¿É
            var repetitiveCartItem = Items.FirstOrDefault(
                i => i.ProductId == product.Id);

            if (repetitiveCartItem != null)
            {
                repetitiveCartItem.Quantity += quantity;
                return;
            }

            Items.Add(new ShoppingCartItem
            {
                Product = product,
                ProductId = product.Id,
                Quantity = quantity,
            });
        }
            
        // ¸ü¸Ä¹ºÎï³µÊýÁ¿
        public void ChangeProductQuantity(Guid productId, int newQuantity)
        {
            var items = Items as ICollection;
            var existingCartItem = items.FirstOrDefault(
                i => i.ProductId == productId);

            if (existingCartItem == null)
            {
                throw new InvalidOperationException(
                    "Cannot find the product in shopping cart");
            }
            existingCartItem.Quantity = newQuantity;
        }

        // ´Ó¹ºÎï³µÖÐÒÆ³ý¸Ã²úÆ·
        public void RemoveItem(Guid productId)
        {
            var items = Items as ICollection;
            var existingCartItem = items.FirstOrDefault(
                i => i.ProductId == productId);

            if (existingCartItem == null)
            {
                throw new InvalidOperationException(
                    "Cannot find the product in shopping cart");
            }

            items.Remove(existingCartItem);
        }
        #endregion
    }
}

´ó¼Ò¿ÉÒÔ¿´µ½ÎÒÃǹºÎﳵʵÌåµÄÂß¼­ºÜÇåÎú£¬ÒòΪÎÒÃǺÜÃ÷È·¹ºÎï³µÓµÓÐÄÄЩ²Ù×÷¡£µ±È»»¹ÓÐÁíÒ»ÖÖ×ö·¨¼´°ÑÕâЩ²Ù×÷¶¼·Åµ½Óû§ÊµÌåÖÐÈ¥£¬ÒòΪ×îÖÕÆäʵÊÇÓû§×öµÄÕâЩ²Ù×÷¡£ÄÇÎÒÃǵľۺϾͱä³ÉÁËÓû§-¹ºÎï³µ-¹ºÎï³µÏÕâÑùҲûÓÐʲô²»¿ÉÒÔ£¬·´¶ø¸ü·ûºÏÕæÊµµÄ³¡¾°¡£µ«ÊǻᵼÖÂÎÒÃǵľۺϹýÅÓ´ó£¬Ò²¾ÍÊÇ˵ÎÒ±ØÐëÒªÏÈÓÐÓû§ÊµÌå²ÅÄܽøÐвÙ×÷£¬Óû§Óû§¿ÉÄÜ»á°óÉϺܶàµÄ¶«Î÷£º¹ºÎï³µ¡¢¶©µ¥¡¢µØÖ·µÈµÈ¡£ÔÚÏÖÔÚ¶¼ÊÇajaxÀ´²Ù×÷µÄ´óÐÍÍøÕ¾ÖУ¬ÎÒÃÇÐèÒªÔÚ·þÎñ¶Ë°ÑÕâ¸öÓû§ÇëÇó¼ÓÔØ³öÀ´ÔÙÖ´ÐÐÌí¼Ó¹ºÎï³µµÄ²Ù×÷ÄØ£¿»¹ÊÇ¿ÉÒÔÖ±½Ó¼ÓÔØ¹ºÎﳵʵÌåÀ´²Ù×÷ÄØ£¿Õâ¾ÍÊÇÒ»¸öÁ£¶ÈµÄÎÊÌ⣬²»Í¬µÄÎÊÌâºÍ³¡¾°£¬´ó¼Ò¿ÉÒÔÇø±ðÀ´¶Ô´ý¡£×ÜÖ®¾ÛºÏÊÇ¿ÉÒÔ¸ù¾ÝÒµÎñ»òÕßÒ»Ð©ÌØ¶¨ÐèÇóÀ´×ö³öµ÷ÕûµÄ¡£±ÈÈç˵¹ºÎï³µ-¹ºÎï³µÏî-²úÆ·£¬ÕâÒ²ÊÇÒ»¸ö¾ÛºÏ£¬µ«ÊÇÓÉÓÚ²úÆ·µÄÌØÊâÐÔ£¬ÎÒÃÇ¿ÉÒ԰ѲúÆ·Ò²×÷Ϊһ¸ö¾ÛºÏ¸ùÀ´µ¥¶À½øÐзÃÎÊ¡£

ÎÒÃÇÀ´¿´Ò»ÏÂÓ¦ÓòãShoppingCartServiceµÄ´úÂ룺

public class ShoppingCartService : IShoppingCartService
{
    private IRepository _shoppingCartRepository;
    private IRepository _productRepository;

    public ShoppingCartService(IRepository shoppingCartRepository,
        IRepository productRepository)
    {
        _shoppingCartRepository = shoppingCartRepository;
        _productRepository = productRepository;
    }

    public ShoppingCart AddToCart(Guid cartId, Guid productId, int quantity)
    {
        var cart = _shoppingCartRepository.GetById(cartId);
        var product = _productRepository.GetById(productId);
        cart.AddItem(product, quantity);

        _shoppingCartRepository.Update(cart);
        return cart;
    }

}

´ËÓ¦Óòã´úÂëÒ»³ö£¬´ó¼Ò¾Í»á·¢ÏÖ£¬Õâ´úÂëÌ«¼ò½àÁË£¬ÓÐľÓУ¿ÒòΪËùÓеÄÂß¼­¡¢ÒµÎñ¶¼±»·Åµ½ÁìÓòʵÌåÄÇÀïÃæÈ¥´¦ÀíÁË¡£¼´Ê¹ÎÒÃÇÒµÎñÂß¼­¸Ä±äÁË£¬»òÕßÎÒÃÇÐèÒªÖØ¹¹ÁË£¬ËüÃǶ¼ÔÚÁìÓòʵÌåÄÇÀïÃæ£¬¸ÄÄÇÀï¾ÍºÃÁË¡£½ÓÏÂÀ´µÄÎÊÌâÊÇ£¬ÈçºÎÈ·±£°²È«£¬ÕýÈ·µÄÒ»´ÎÓÖÒ»´ÎµÄ¶ÔÁìÓòʵÌå½øÐÐÖØ¹¹ÄØ£¿±Ï¾¹ËüÒ²ÊǸ÷ÖÖ¹ØÁª£¬¸÷ÖÖÒÀÀÁѽ£¿ÄúÇë½Ó×ÅÍùÏ¿´ÎÒÃǵĵ¥Ôª²âÊÔ»·½Ú¡£

¶ÀÁ¢ÁìÓòÒµÎñ²ã - ¸ßÄÚ¾Û£¬µÍñîºÏ£¬¿É²âÊÔ

½²µ½ÕâÀÇëÔÊÐíÎÒ´ÓÍøÉϵÁÒ»ÕÅͼ£¬µ±È»ÕâÕÅͼÔç¾ÍÒѾ­ÊDZ»ÒýÓùýÎÞÊý´ÎÁË£¬Ëü¾ÍÊÇDDDÖÐʹÓõķֲã½á¹¹¡£

¹ØÓÚÕâ¸ö·Ö²ã£¬Ã¿Ò»²ãÊǸÉʲôµÄ£¬¾ßÌåÔõÃ´Íæ£¬´ó¼Ò¿ÉÒÔ¿´Ò»ÏÂdaxµÄÕâһƪÎÄÕ½²½âµÄºÜÇå³þ¡£×ÜÖ®£¬ÎÒÃǵÄÁìÓòÄ£ÐÍÒÔ¼°Ïà¹ØµÄÀà±ÈÈ繤³§µÈ»á±»¶ÀÁ¢³ÉΪһ²ãÀ´ÓëÓ¦ÓòãºÍ»ù´¡Éè¼Æ²ã½»»¥¡£

ÁìÓò²ãÊǶÀÁ¢µÄ£¬Ê×ÏÈËüÊÇÓ¦ÓòãµÄϲ㣬ËùÒԿ϶¨²»»áÓжÔÓ¦ÓòãµÄÒÀÀÁ£¬µ«ÊÇÁìÓòÓÐһЩģÐÍ»òÕß·þÎñÉÙ²»ÁËÊÇÒªÓëÊý¾Ý¿â´ò½»µÀµÄ£¬±ÈÈç˵ÎÒÃÇÔÚ×¢²áÓû§µÄʱºòÐèҪȥÑéÖ¤µ±Ç°µÄÓÊÏäÊDz»ÊÇÒѾ­±»Õ¼ÓÃÁË¡£¶øÕâÒ»Àà²Ù×÷¶¼ÊÇÊôÓÚ»ù´¡ÉèÊ©²ã×öµÄÊÂÇ飬°üº¬ÏñһЩÊý¾Ý¿â²Ù×÷£¬ÈÕÖ¾£¬»º´æµÈµÈ¡£ÄÇôÎÒÃÇÈçºÎ±ÜÃâÁìÓò²ã¶Ô»ù´¡ÉèÊ©²ãµÄÒÀÀÁÄØ£¿¸ÐÐ»ÃæÏò¶ÔÏóÉè¼Æ - ÃæÏò½Ó¿Ú±à³Ì£¬Ö»²»¹ýÕâÀïÃæµÄ³¡¾°ÌرðÓдú±íÐÔ£¬ËüÊÇÒ»¸ö·Ç³£³£¼ûµÄÎÊÌ⣬ÓÚÊÇËü³ÉΪÁËÒ»¸öģʽ£º²Ö´¢£¨Repository)¡£

namespace RepositoryAndEf.Core.Data
{
public partial interface IRepository<T> where T : BaseEntity
{
T GetById(object id);

IEnumerable<T> Get(
Expression<Func<T, Boolean>> predicate);

bool Insert(T entity);
bool Update(T entity);
bool Delete(T entity);
}
}

Ò»°ãÇé¿öÏ£¬ÎÒÃÇ»á°Ñ²Ö´¢µÄ½Ó¿Ú·Åµ½ÁìÓò²ã£¬»òÕßÒ²¿ÉÒÔÔÙ½¨Ò»¸öCore²ãÀ´×÷¸öÏîÄ¿×îÏÂÃæµÄÄÇÒ»²ãÌṩһЩ×¹²µÄ×é¼þ²¿·Ö¡£¹ØÓÚ²Ö´¢µÄ´úÂ룬´ó¼ÒÔÚÉÏÃæÁìÓò·þÎñUserServiceÖеÄ×¢²á´úÂëÖоÍÒѾ­¼ûµ½¹ýÁË¡£¿ÉÄÜÐèҪעÒâµÄÊÇ£¬RepositoryÓÃÀ´½«Êý¾Ý¿âÓëÆäËüµÄÒµÎñºÍ¼¼Êõ·ÖÀ룬ËùÒÔÎÒÃÇÔÚÁìÓò²ãÖÐʹÓÃËü£¬»¹ÔÚÓ¦ÓòãÖÐʹÓÃËü¡£

RepositoryÈÃÎÒÃÇרעÓÚÄ£ÐÍ£¬²»ÓÃÈ¥¿¼Âdz־û¯µÄÎÊÌâ¡£¸üÎªÖØÒªµÄÒ»µãÊÇ£¬ÒòΪËüÊǽӿڣ¬ËùÒÔÎÒÃÇ¿ÉÒԺܷ½±ãµÄÌæ´úËü£¬»òÕßÄ£ÄâÒ»¸öʵÏÖÀ´¶ÔÎÒÃǵÄÁìÓòÄ£ÐͽøÐе¥Ôª²âÊÔ¡£ÏÂÃæÊÇÎÒÃÇʵÏÖµÄMockRepositoryµÄ´úÂ룺

public class MockRepository<T>: IRepository<T> where T : BaseEntity
{
private List<T> _list = new List<T>();

public T GetById(Guid id)
{
return _list.FirstOrDefault(e => e.Id == id);
}

public IEnumerable<T> Get(Expression<Func<T, bool>> predicate)
{
return _list.Where(predicate.Compile());
}

public bool Insert(T entity)
{
if (GetById(entity.Id) != null)
{
throw new InvalidCastException("The id has already existed");
}

_list.Add(entity);
return true;
}

public bool Update(T entity)
{
var existingEntity = GetById(entity.Id);
if (existingEntity == null)
{
throw new InvalidCastException("Cannot find the entity.");
}

existingEntity = entity;
return true;
}

public bool Delete(T entity)
{
var existingEntity = GetById(entity.Id);
if (existingEntity == null)
{
throw new InvalidCastException("Cannot find the entity.");
}

_list.Remove(entity);
return true;
}

ÏÂÃæÎÒÃǸøÎÒÃÇUserÁìÓòʵÌåµÄ×¢²á·½·¨¼ÓÒ»¸ö¼ì²éEmailÊÇ·ñ´æÔÚµÄÂß¼­¡£

public virtual User Register(string email, string name, string password)
{
    if (_userRepository.Get().Any(u => u.Email == email))
    {
        throw new ArgumentException("email has already existed");
    }

    var user = new User
    {
        Id = Guid.NewGuid(),
        Email = email,
        Name = name,
        Password = password
    };

    user.CreateShoppingCart();
    _userRepository.Insert(user);
    return user;
}

ÔÚÎÒÃÇÕæÊµµÄRepository³öÀ´Ö®Ç°£¬²»¹ÜÎÒÃÇÊÇ´òËãÊÇEF£¬»¹ÊÇNHibernate£¬ÎÒÃÇÏÖÔÚÖ»Òª¶ÔÕâ¸öMockµÄRepositoryÀ´±à³Ì»òÕß½øÐе¥Ôª²âÊԾͿÉÒÔÁË¡£

//UserServiceÁìÓò·þÎñÔÚµ¥Ôª²âÊÔ

public class UserServiceTests
{
    private IRepository _userRepository = new MockRepository();

    [Fact]
    public void RegisterUser_ExpectedParameters_Success()
    {
        var userService = new UserService(_userRepository);
        var registeredUser = userService.Register(
            "hellojesseliu@outlook.com", 
            "Jesse", 
            "Jesse");

        var userFromRepository = _userRepository.GetById(registeredUser.Id);

        userFromRepository.Should().NotBe(null);
        userFromRepository.Email.Should().Be("hellojesseliu@outlook.com");
        userFromRepository.Name.Should().Be("Jesse");
        userFromRepository.Password.Should().Be("Jesse");
    }

    [Fact]
    public void RegisterUser_ExistedEmail_ThrowException()
    {
        var userService = new UserService(_userRepository);
        var registeredUser = userService.Register(
            "hellojesseliu@outlook.com", 
            "Jesse", 
            "Jesse");

        var userFromRepository = _userRepository.GetById(registeredUser.Id);
        userFromRepository.Should().NotBe(null);

        Action action = () => userService.Register(
            "hellojesseliu@outlook.com", 
            "Jesse_01",
            "Jesse");
        action.ShouldThrow();
    }
}

ÎÒÃÇÓõÄXUnit.net×÷µ¥Ôª²âÊÔ¿ò¼Ü£¬Í¬Ê±ÓÃÁËFluent Assertions¡£

½á¹ûºÜƯÁÁ£¬ÓÐľÓУ¿ÓÐÁ˵¥Ôª²âÊÔÀ´ÎªÎÒÃǵÄÁìÓòÄ£Ðͱ£¼Ý»¤º½£¬ÎÒÃǾͿÉÒÔ°²È«µÄ½øÐÐÖØ¹¹ÁË¡£

¸É¾»Æ¯ÁÁµÄ´úÂë

¾­³£ÓÐÈË˵´úÂëÊÇÒ»¼þÒÕÊõ£¬ÂëÅ©¶¼ÊÇÒÕÊõ¼Ò¡£ÎÒºÜϲ»¶Õâ¾ä»°£¬Èç¹ûÄãÒ²ÈÏͬ£¬ÄǾÍÇëÏñ¶Ô´ýÒÕÊõÆ·Ò»Ñù¶Ô´ýÎÒÃǵĴúÂ룬¾«ÐĵĴòÄ¥Ëü¡£²¢ÇÒÄã²»Ò»¶¨Òª·Ç³£µÄÓо­Ñé²Å¿ÉÒÔ¸ÉÕâ¼þÊÂÇ飻

Èç¹ûÄã¸ÕÈëÐУ¬ÄÇÖÁÉÙ±£Ö¤Ò»´úÂë¿É¶ÁÐԺ㨺õÄÃüÃû£¬´úÂëÂß¼­ÇåÎúµÈ£©£»

ÔÙÍùÉÏÒ»µã£¬ÄãÒªÄܹ»¸üºÃµÄ×éÖ¯´úÂ루À࣬º¯Êý£©£»

µÈµ½ÄãÒ²³ÉΪר¼ÒÁË£¬ÄǾͿªÊ¼¿¼ÂÇÒ»Ð©ÖØÓÃÐÔ£¬¿ÉÀ©Õ¹ÐÔ£¬¿Éά»¤ÐÔ£¬¿É²âÊÔÐÔµÄÕâЩ±È½Ï·¶µÄ¶«Î÷ÁË£»

¶ø×îºó¾ÍÉÏÉýµ½¼Ü¹¹²ãÃæ£¬¿¼ÂÇϵͳ¸÷¸ö×é¼þÖ®¼äͨѶ£¬·Ö²ã£¬µÈµÈ¡£×îºóÄã¾Í³ÉΪÂëÉñÁË¡£

DDDÀïÃæÒýÈëµÄһЩ˼·°üÀ¨·Ö²ã¡¢ÒÀÀÁ×¢Èë¡¢²Ö´¢µÈ£¬¿ÉÒÔ¸øÎÒÃÇһЩָµ¼£¬´ó¼Ò´ÓÉÏÃæµÄ´úÂëÒ²¿ÉÒÔ¿´³öÕâЩ´úÂë×éÖ¯µÄºÜºÃ£¬Âß¼­Ò²²»»áÉ¢Âҵĵ½´¦¶¼ÊÇ¡£µ±È»Õâ¸öÏîÄ¿´úÂëÁ¿ÓÐÏÞ£¬Ëµ·þÁ¦ÊÇÓÐÏ޵ģ¬ºóÃæÎÒÃÇ»¹»á³¢ÊÔÈ¥¼ÓÈëÓ¦ÓòãµÄ´úÂë

»¶Ó­´ó¼ÒFollow¡£×¢Òâ´úÂ뻹ûÓÐдÍֻ꣬ÊÇÒ»¸ö³õ¼¶°æ±¾£¬ÎÒÃǺóÃæ»áÂýÂýÍêÉÆ¡£Õâ¸öÏîÄ¿»áʹÓÃEFÀ´×÷ÒµORM¿ò¼Ü£¬Autofac×÷ÒÀÀÁ×¢ÈëÈÝÆ÷£¬ÓÃXunit×÷µ¥Ôª²âÊÔ¿ò¼ÜµÄͬʱÒýÈëÁËFluent Assertions¡£

С½á

±¾ÎÄÖ÷Òª½éÉÜÁËDDDµÄһЩ»ù´¡¸ÅÄ

1.ÁìÓòÄ£ÐÍ£ºÁìÓòʵÌå¡¢ÁìÓò·þÎñÒÔ¼°Öµ¶ÔÏó£»½¨Ä£Ò»¶¨Òª´ÓÕæÊµµÄÁìÓòÒµÎñ³ö·¢£¬¶àÓëÁìÓòר¼Ò½øÐйµÍ¨À´ÍêÉÆÄ£ÐÍ¡£

2.¾ÛºÏÓë¾ÛºÏ¸ù£ºËüµÄÖ÷Òª×÷ÓÃÊÇÓÃÀ´È·±£¸÷ÖÖ¹ØÏµÏµÄʵÌåµÄÊý¾ÝÒ»ÖÂÐÔ£»µ«ÊÇÈ·ÈϾۺϸùÕâ¸ö¹ý³Ì£¬Êµ¼ÊÉÏÒ²ÊǶÔÒµÎñµÄÊáÀí¹ý³Ì¡£

3.¼Ü¹¹·Ö²ã£º ÿһ²ã¶¼Ö°ÔðÇå³þ£»ÒÀÀÁÓÚ½Ó¿ÚÀ´½µµÍñîºÏ¡£

4.·â×°ºÍ²âÊÔ£º ËùÓеÄÒµÎñ¶¼·Åµ½ÁìÓò²ã£¬Í¬Ê±¶ÔÁìÓò²ã½øÐе¥Ôª²âÊÔÀ´È·±£×îºËÐĵÄÂß¼­²»»áÔâµ½ÆÆ»µ¡£

¸öÈ˸оõûÓбØÒªÌ«Ç¿µ÷RepositoryµÄ¸ÅÄ´ÓÁìÓòʵÌåµÄÉúÃüÖÜÆÚ£¨´´½¨-³Ö¾Ã»¯µ½Êý¾Ý¿â-Ïú»Ù-´ÓÊý¾Ý¿âÖØ½¨£©Äã»á·¢ÏÖÆäʵÕâ¸ö¹ý³ÌºÜÆÕ±é£¬²¢²»ÊÇÖ»ÓÐDDD²ÅÓеġ£ËùÒÔÎÒÈÏΪRepositoryÖ÷ÒªÊǽ«Êý¾Ý·ÃÎʹ¦Äܸø¸ôÀ뿪£¬±ÜÃâÁìÓòʵÌå¶Ô»ù´¡ÉèÊ©²ãµÄÒÀÀÁ¡£ÄÇËüºÍÈý²ãÓÐÊ²Ã´Çø±ð£¿ BLL ÒýÓÃDAL²»Ò²ÊÇÒÀÀÁÓÚ½Ó¿Úô£¿¸øÎҵĸоõÊÇ£¬DDDµÄÁìÓòʵÌå³Ö¾Ã»¯ÕâÒ»¿é¾ÍÊÇÈý²ãÀïÃæµÄ˼·¡£Õâ¿ÉÄÜÊÇÔÚѧϰDDD³õÆÚµÄÏë·¨£¬ÒòÎªÕæÊµµÄ´óÐÍÏîÄ¿ÖÐÊDz»»áÖ±½Ó°ÑÁìÓòʵÌ司³Ö¾Ã»¯µÄ£¬ÄǸö½ÐDTO£¬ÓÚÊÇRepository<>ÀïÃæ·ÅµÄ¾Í²»ÊÇÎÒÃǵÄÁìÓòʵÌåÁË£¬¶øÊǽ«ÁìÓòʵÌåת»»³É¶ÔÓ¦µÄDTO¡£

ÊÇ·ñÒ»¶¨ÒªÊ¹ÓÃDTOÄØ£¿ÁìÓòʵÌåºÍDTO»¥Ïàת»»£¬×îºóµ½Á˱íÏÖ²ãDTO»¹ÒªºÍViewModelת»»£¬»á²»»á´øÀ´¸´ÔÓÐÔºÍÐÔÄÜÉϵÄËðʧ£¿RepositoryºÍEF»¹ÓÐUnit Of WorkÔõôÀ´Ð­µ÷£¿±§Ô¹Ð´µ¥Ôª²âÊÔô£¿ÔõôÑùÈÃдµ¥Ôª²âÊÔ²»±ä³ÉÖ»ÊÇ×ß¹ý³¡¶øÒÑ£¿ ÕâЩÎÊÌâÁô¸øÎÒÃǺóÃæÔÙ½â¾ö°É¡£

   
2632 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

ÆóÒµ¼Ü¹¹¡¢TOGAFÓëArchiMate¸ÅÀÀ
¼Ü¹¹Ê¦Ö®Â·-ÈçºÎ×öºÃÒµÎñ½¨Ä££¿
´óÐÍÍøÕ¾µçÉÌÍøÕ¾¼Ü¹¹°¸ÀýºÍ¼¼Êõ¼Ü¹¹µÄʾÀý
ÍêÕûµÄArchimateÊÓµãÖ¸ÄÏ£¨°üÀ¨Ê¾Àý£©
Ïà¹ØÎĵµ

Êý¾ÝÖÐ̨¼¼Êõ¼Ü¹¹·½·¨ÂÛÓëʵ¼ù
ÊÊÓÃArchiMate¡¢EA ºÍ iSpace½øÐÐÆóÒµ¼Ü¹¹½¨Ä£
ZachmanÆóÒµ¼Ü¹¹¿ò¼Ü¼ò½é
ÆóÒµ¼Ü¹¹ÈÃSOAÂ䵨
Ïà¹Ø¿Î³Ì

ÔÆÆ½Ì¨Óë΢·þÎñ¼Ü¹¹Éè¼Æ
ÖÐ̨սÂÔ¡¢ÖÐ̨½¨ÉèÓëÊý×ÖÉÌÒµ
ÒÚ¼¶Óû§¸ß²¢·¢¡¢¸ß¿ÉÓÃϵͳ¼Ü¹¹
¸ß¿ÉÓ÷ֲ¼Ê½¼Ü¹¹Éè¼ÆÓëʵ¼ù
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

ר¼ÒÊӽǿ´ITÓë¼Ü¹¹
Èí¼þ¼Ü¹¹Éè¼Æ
ÃæÏò·þÎñÌåϵ¼Ü¹¹ºÍÒµÎñ×é¼þ
ÈËÈËÍøÒÆ¶¯¿ª·¢¼Ü¹¹
¼Ü¹¹¸¯»¯Ö®ÃÕ
̸ƽ̨¼´·þÎñPaaS


ÃæÏòÓ¦Óõļܹ¹Éè¼ÆÊµ¼ù
µ¥Ôª²âÊÔ+ÖØ¹¹+Éè¼ÆÄ£Ê½
Èí¼þ¼Ü¹¹Ê¦¡ª¸ß¼¶Êµ¼ù
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ¡ª¸ß¼¶Êµ¼ù
SOAÌåϵ½á¹¹Êµ¼ù


Èñ°²¿Æ¼¼ Èí¼þ¼Ü¹¹Éè¼Æ·½·¨
³É¶¼ ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
ÉϺ£Æû³µ ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
±±¾© Èí¼þ¼Ü¹¹Éè¼Æ
ÉϺ£ Èí¼þ¼Ü¹¹Éè¼Æ°¸ÀýÓëʵ¼ù
±±¾© ¼Ü¹¹Éè¼Æ·½·¨°¸ÀýÓëʵ¼ù
ÉîÛÚ ¼Ü¹¹Éè¼Æ·½·¨°¸ÀýÓëʵ¼ù
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ¡ª¸ß¼¶Êµ¼ù