¸ÅÊö
ÁìÓòÇý¶¯Éè¼ÆÒ²¾ÍÊÇ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ÔõôÀ´Ðµ÷£¿±§Ô¹Ð´µ¥Ôª²âÊÔô£¿ÔõôÑùÈÃдµ¥Ôª²âÊÔ²»±ä³ÉÖ»ÊÇ×ß¹ý³¡¶øÒÑ£¿ ÕâЩÎÊÌâÁô¸øÎÒÃǺóÃæÔÙ½â¾ö°É¡£
|