±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ²©¿ÍÔ°£¬ÎÄÕ½éÉÜÁË×÷ÕßÔÚ¹¤×÷¹ý³ÌÖпª·¢SOAϵͳËùÈÏʶµ½µÄÎÊÌ⣬Ïêϸ½éÉÜÁËÓ¦Óòã
¡¢ÏµÍ³×ÜÌå¼Ü¹¹µÈÏà¹ØÖªÊ¶¡£
|
|
ÒýÑÔ
±¾ÎÄÖ÷ÒªÊDzο¼Martion FowlerËùÖøµÄ¡¶ÆóÒµÓ¦Óüܹ¹Ä£Ê½¡·ÓëEric
EvansËùÖøµÄ¡¶ÁìÓòÇý¶¯Éè¼Æ¡·ÕâÁ½±¾Ì©É½Ö®×÷£¬¼ÓÉϱ¾ÈËÔÚ½üÄêʵ¼ÊµÄ¹¤×÷¹ý³ÌÖпª·¢SOAϵͳËùÈÏʶµ½µÄÎÊÌâËùдµÄһƪÎÄÕ£¬»¶Ó¸÷λµãÆÀ¡£
×îºóÁ½½Ú ϸ˵ӦÓò㠡¢ÏµÍ³×ÜÌå¼Ü¹¹ ÊDZ¾ÎĵÄÖØµã£¬×ÅÖØËµÃ÷ÁìÓòÇý¶¯Éè¼ÆÓëSOAÖ®¼äµÄ¹ØÏµ£¬¶ÔDDDÓÐÒ»¶¨»ù´¡µÄÅóÓÑ¿ÉÒÔÔ½¹ýÇ°ÃæµÄ¼¸½Ú£¬Ö±½Ó²é¿´µÚÆß¡¢°Ë½Ú¡£
Ô´´úÂëÏÂÔØ £¨Êý¾Ý¿â¿ÉÒÔÔÚ.edmxÎļþ¸ù¾ÝÄ£ÐÍÉú³É£©
Ŀ¼
Ò»¡¢SOAÓëDDDµÄ¶¨Òå
¶þ¡¢DDDµÄ·Ö²ã½á¹¹
Èý¡¢°ÑÒµÎñ¹ØÏµ×ª»¯ÎªÁìÓòÄ£ÐÍ
ËÄ¡¢Ï¸ËµRepository
Îå¡¢ÁìÓò²ãµÄ·þÎñ
Áù¡¢¹¤³§Ä£Ê½Factory
Æß¡¢Ï¸ËµÓ¦Óòã
°Ë¡¢ÏµÍ³×ÜÌå¼Ü¹¹
Ò»¡¢SOAÓëDDDµÄ¶¨Òå
SOAÓëDDD¶¼Êdz£ÓõÄϵͳ¼Ü¹¹£¬µ«Á½ÕßÖ®¼äËùÕë¶ÔµÄºËÐÄÊDz»Í¬µÄ¡£
SOA£¨ÃæÏò·þÎñ¼Ü¹¹£©ÓÉGartner ÔÚ1996ÄêÌá³öÀ´£¬ËüÊÇÒ»ÖÖ·Ö²¼Ê½µÄÈí¼þ¼Ü¹¹£¬Ëü¿ÉÒÔ¸ù¾ÝÐèÇóͨ¹ýÍøÂç¶ÔËÉÉ¢ñîºÏµÄ´ÖÁ£¶ÈÓ¦ÓÃ×é¼þ½øÐв¿Êð¡¢×éºÏºÍʹÓ᣼òµ¥À´Ëµ£¬SOA¾ÍÊÇÒ»ÖÖ´óÐÍϵͳ¿ª·¢µÄÌåϵ¼Ü¹¹£¬ÔÚ»ùÓÚSOA¼Ü¹¹µÄϵͳÖУ¬¾ßÌåÓ¦ÓóÌÐòµÄ¹¦ÄÜÊÇÓÉһЩËÉñîºÏ²¢ÇÒ¾ßÓÐͳһ½Ó¿ÚµÄ×é¼þ£¨Ò²¾ÍÊÇservice£©×éºÏ¹¹½¨ÆðÀ´µÄ£¬ËüÊÇÕë¶Ô¶àºËÐÄ¶àÆ½Ì¨Ö®¼äµÄÊý¾Ý½»»»¡£
DDD£¨ÁìÓòÇý¶¯Éè¼Æ£©ÓÉEric EvansÔÚ2004Ìá³ö£¬ËüµÄºËÐÄÄÚÈÝÊÇ¡°ÈçºÎ½«ÒµÎñÁìÓò¸ÅÄîÓ³Éäµ½Èí¼þ¹¤³Ìµ±ÖС±¡£ËüÍÆ·ÁË¡°Èí¼þ´ÓÊý¾Ý²ã¿ª·¢Éè¼Æ¡±µÄ¾Éϰ¹ß£¬Ç¿µ÷ÁìÓòÄ£ÐÍÔÚÈí¼þÖз¢»ÓµÄÇ¿´óÁ¦Á¿£¬×¢ÖØÈçºÎ°ÑÆóÒµÄÚ²¿¸´ÔÓµÄÒµÎñÁ÷³Ìת»¯ÎªÈí¼þ¡£
Ò²Ðí¿ÉÒÔÈÏΪSOAÕë¶ÔµÄÊÇ´óÐÍϵͳµÄ×ÜÌå¼Ü¹¹£¬×¢ÖØÈçºÎ°Ñϵͳ½øÐÐÏîÄ¿·ÖÀ룬¸ôÀ뿪·¢£¬×îºóʵÏÖϵͳºÏ²¢¡£¶øDDDÊÇÕë¶Ôµ¥¸öÏîÄ¿µÄ¿ª·¢¹ÜÀí¹ý³Ì£¬×¢ÖØÈçºÎÀûÓÃÁìÓòÄ£ÐͰÑÒµÎñÐèÇóת»¯ÎªÈí¼þ¡£Á½ÕßÖ®¼ä²¢Ã»ÓдæÔÚÀíÂÛÉϵijåÍ»£¬ÄܰÑÁ½Õß½áºÏ£¬¸÷Õ¹Ëù³¤£¬¸üÄÜ·¢»Ó¸÷×ÔµÄÓÅÊÆ¡£
¶þ¡¢DDDµÄ·Ö²ã½á¹¹
1. ¸ÅÄî
´Ó¸ÅÄîÉÏÀ´Ëµ£¬ÁìÓòÇý¶¯Éè¼Æ¼Ü¹¹Ö÷Òª·ÖΪ»ù´¡ÉèÊ©²ã¡¢ÁìÓò²ã¡¢Ó¦Óò㡢±íÏÖ²ã4¸ö¸ÅÄî²ã¡£
»ù´¡½á¹¹²ã£ºÊÇΪ¸÷²ãÌṩ¸÷ÏîͨÓü¼ÊõÄÜÁ¦¶ø¹¹½¨µÄ£¬Ëü¿ÉÒÔΪÁìÓò²ãÌṩÏñHibernate¡¢LINQ¡¢ADO.NETµÈ³Ö¾Ã»¯»úÖÆ£¬ÎªÓ¦Óò㴫µÝÏûÏ¢£¬Îª±íÏÖ²ãÌṩ²å¼þµÈµÈ¡£
ÁìÓò²ã£ºËüÊÇϵͳµÄºËÐIJ¿·Ö£¬´ú±íÒµÎñµÄÂß¼¸ÅÄî¡£Ëü»á¸ù¾ÝÒµÎñµÄʵ¼ÊÁ÷³Ì¶¨ÖÆÁËÒµÎñÐÅÏ¢ÒÔ¼°ÒµÎñ¹æÔò£¬²¢°´Ò»¶¨µÄ¹ØÏµÖƶ¨ÁìÓòÄ£ÐÍ¡£ÁìÓòÄ£Ð;¡¹ÜÐèÒªÒÀÀµ»ù´¡½á¹¹²ã½øÐб£´æ£¬µ«ÁìÓòÄ£ÐÍÖ®¼äµÄÂß¼¹ØÏµÊǸú»ù´¡½á¹¹²ãÏà¸ôÀëµÄ¡£¼´Ê¹»ù´¡½á¹¹²ã´ÓNHibernate¼¼Êõת»»³ÉLINQ¼¼Êõ£¬Ò²²»»áÓ°Ïìµ½ÁìÓò²ãµÄ½á¹¹¡£ÁìÓòÄ£ÐÍÖ»»áÒÀÀµÊµ¼ÊµÄÒµÎñÂß¼£¬ËüÖ»»á¸ù¾ÝÒµÎñµÄת±ä¶øÁé»î±ä¶¯¡£
Ó¦Óò㣺ËüµÄÈÎÎñÊÇе÷ÁìÓò²ãÓë±íÏÖ²ãÖ®¼äµÄ¹ØÏµ£¬Ò²¿ÉÒÔ×÷ΪϵͳÓëÍâ½ç¹µÍ¨µÄÇÅÁº£¬ÔÚÕâ²ãÀïÃæ²»»á°üÀ¨ÈκεÄÒµÎñÂß¼¡£ÔÚSOAÃæÏò·þÎñ¼Ü¹¹£¬ÕâÒ»²ãÆð×ÅÖØÒªµÄ×÷Óã¬ÔÚµÚÆß½Ú½«Ïêϸ˵Ã÷¡£
±íÏֲ㣺ËüÊdz£ÓõĽçÃæ¿ª·¢£¬¿ÉÒÔÒÔÒ³Ãæ£¨ASP.NET¡¢JSP£©£¬´°¿Ú£¨WinForm¡¢WPF¡¢Swing£©µÈÐÎʽ±íÏÖ£¬ËüµÄÖ÷ÒªÖ°ÔðÊǸºÔðÓëÓû§½øÐÐÐÅÏ¢¹µÍ¨(×¢Ò⣺ÔÚÒ»°ãµÄÏîÄ¿¿ª·¢ÖУ¬Web·þÎñ»á×÷ΪÓëÍâ½çͨѶµÄ½Ó¿Ú·ÅÖÃÔÚ±íÏÖ²ãÖУ¬µ«ÔÚSOAÖУ¬Web·þÎñ»á´ó¶àÖÃÓÚÓ¦ÓòãÖУ¬ÏÂÃæ½«»á×÷½øÒ»²½½âÊÍ£©

2. ¿ª·¢ÊµÀý
ÔÚ´ËÏȾٸö³£¼ûµÄ¶©µ¥¹ÜÀíÀý×Ó£¬ÔÚÏÂÃæµÄÕ½ÚÀï¶¼»áÒÔÕâ¸öʵÀýΪ²Î¿¼£º
ÿ¸öÓû§ÔÚPerson±íÀïÃæ¶¼»áÓÐÒ»¸ö¶ÔÓ¦µÄÕÊ»§£¬ÀïÃæ¼Ç¼ÁËÓû§µÄÐÕÃû¡¢µØÖ·¡¢µç»°¡¢»ý·Ö£¨Point£©µÈ»ù±¾ÐÅÏ¢¡£
ÔÚOrder±íÀï¼Ç¼µÄÊÇÿ´Î½»Ò׵Ĺý³Ì£¬Ã¿´ÎÉÌÆ·µÄËÍ»õ·Ñ£¨Freightage£©Îª10Ôª£¬µ±ÉÌÆ·¼Û¸ñ£¨Price£©³¬¹ý98Ôª¿ÉÃâ·ÑËÍ»õ£¬µ±Óû§Person»ý·Ö£¨Point£©³¬¹ý2000·Ö¿É»ñ7ÕÛÓŻݣ¨Favorable£©£¬1000~2000·Ö¿É»ñ8ÕÛ£¬1000·ÖÒÔÏ¿ÉÓÐ9ÕÛ£¬×îºó×ÜÌå¼Û¸ñΪΪ£¨TotalPrice£©¡£
ÔÚ×îºó½áµ¥µÄʱºòOrder±íÀï»á²úÉú¶©µ¥ºÅÂëOrderNumberºÍ϶©ÈÕÆÚDelivery£¬Person±íµÄ»ý·ÖÒ²»á¼ÓÉ϶©µ¥×ܼ۵ĵãÊý¡£
×îºóOrderItem±í°üº¬ÁËÎïÆ·Goods¡¢ÎïÆ·¼Û¸ñPrice¡¢¹ºÂòÊýÁ¿CountµÈÊôÐÔ£¬ËüÖ÷Òª¼Ç¼ÿ´Î¶©µ¥µÄÏêϸ½»Ò××´¿ö¡£
ÉÏÃæµÄÒµÎñÂß¼¸úÌÔ±¦¡¢µ±µ±µÈµÈ´óÐ͹ºÎïÍø»ù±¾ÏàËÆ¡£Ö®ËùÒÔÓÃÕâÑùÒ»¸öÀý×Ó×÷Ϊ²Î¿¼£¬ÊÇÏë±íÏÖÒ»ÏÂDDDÊÇÈç¹ûÀûÓÃÁìÓòÄ£ÐÍÈ¥ÊÊÓ¦¶à±äµÄÒµÎñÂß¼¹ØÏµ¡£
Èý¡¢°ÑÒµÎñ¹ØÏµ×ª»¯ÎªÁìÓòÄ£ÐÍ
1. ¸ÅÄî
Ä£ÐÍÇý¶¯Éè¼ÆÉè¼Æ£¨MODEL-DRIVEN-DESIGN£©ÊÇDDDÀïÃæµÄºËÐÄ£¬Ëü´ú±íµÄÊǸ÷¸ö¶ÔÏóÖ®¼äµÄ¹ØÏµ£¬°Ñ¸´ÔÓµÄÂß¼¹ØÏµ×ª»¯ÎªÄ£ÐÍ¡£
Ä£ÐÍÖ÷Òª·ÖΪʵÌ壨Entity£©¡¢Öµ¶ÔÏó£¨Value Object£©Óë·þÎñ£¨Service£©ÈýÖÖ¡£
ʵÌ壺ʵÌåËù°üº¬µÄ²»µ¥Ö¹ÊÇÒ»Á¬´®µÄÊôÐÔ£¬¸üÖØÒªµÄÊÇÓëʼþµÄÁªÏµ£¬ÔÚÒ»¸öÉúÃüÖÜÆÚÖл·¾³µÄ±ä»¯Óëʼþ·¢Éú£¬½«ÒýÆðʵÌåÄÚ²¿²úÉú±ä»¯¡£ºÃÏñÔÚʵÌåOrderÀïÃæ£¬PersonµÄ»ý·Ö£¨Point£©ºÍOrderItemµÄ¼Û¸ñ£¨Price£©¶¼»áÖ±½ÓÓ°Ïì×ÜÌå¼Û¸ñ£¨TotalPrice£©µÄ´óС£¬¶ø×ÜÌå¼Û¸ñÒ²»áÓ°Ïìµ½ÔË·ÑFreightageµÄ¶àÉٵȵȡ£ÔÚOrderʵÌåµÄÒ»ÇУ¬¶¼»áÊܵ½Person¡¢OrderItemµÈÕâЩÍⲿÒòÊýµÄÓ°Ï죬ÕâÑùµÄ¶ÔÏó±»ÊÓΪʵÌå¡£ÔÚ²»Í¬µÄʱ¿Ì£¬ÊµÌå»áÓв»Í¬µÄ״̬£¬ËùÒÔÔÚ¿ª·¢¹ý³ÌÖÐÎÒÃÇÐèҪΪʵÌå¼ÓÉÏÒ»¸ö¡°±êʶ·û¡±À´Çø·Ö¶ÔÏóµÄÉí·Ý£¬ËüÊÇʵÌåµÄÉúÃüÖÜÆÚÀïµÄΨһ±êÖ¾¡£
Öµ¶ÔÏ󣺵±ËùÓõ½µÄ¶ÔÏóÖ»ÓÐÊôÐÔ¶øÃ»ÓÐÆäËûÂß¼¹ØÏµµÄʱºò£¬ÎÒÃǾͿÉÒÔ°ÑËüÊÓΪÊÇÖµ¶ÔÏó¡£Öµ¶ÔÏóûÓÐ״̬£¬Ò²²»ÐèÒªÓÐ
¡°±êʶ·û¡±¡£ÔÚ¶àÊýÇé¿öÏÂËü¿ÉÒÔ×÷Ϊһ¸öÊôÐÔ´æÔÚÓÚÒ»¸öʵÌåµÄÄÚ²¿¡£Ò»°ãÇé¿öÏÂÖµ¶ÔÏóµÄÊôÐÔÊDz»¿É¸Ä±äµÄ£¬µ±ÐèÒª¸ü¸ÄÊôÐÔʱ£¬¿ÉÒÔ°ÑÕû¸ö¶ÔÏóɾ³ý£¬È»ºóÖØÐ¼ÓÈëÒ»¸öжÔÏó¡£
·þÎñ£ºµ±ÊµÌåÖ®¼ä´æÔÚijЩ²Ù×÷£¬ËüÃDz¢²»µ¥Ò»µØ¸½ÊôÓÚijһ¸öʵÌ壬¶øÊǸú¶à¸öʵÌå¶¼ÓйØÁªµÄʱºò£¬¾Í¿ÉÒÔʹÓ÷þÎñÀ´·â×°ÕâЩ²Ù×÷¡£ÖµµÃ×¢ÒâµÄÊÇ·þÎñ²¢·Çµ¥¶ÀÖ¸Web
Service, Ò²²¢·Çµ¥µ¥´æÔÚÓÚÁìÓò²ã£¬¶øÊÇÔÚ¸÷¸ö²ãµ±Öж¼»á´æÔÚ·þÎñ£¬Ã¿Ò»²ãµÄ·þÎñ¶¼ÓÐ×Ų»Í¬µÄÖ°ÄÜ¡£ÔÚ»ù´¡½á¹¹²ã·þÎñ¿ÉÄÜÊÇÓÃÓÚ¹¹½¨Éí·ÝÑéÖ¤¡¢µç×ÓÓʼþ¡¢´íÎó´¦ÀíµÈµÈ²Ù×÷£»ÔÚÁìÓò²ã£¬·þÎñ¸ü¶àʱºòÊÇÒ»ÖÖ²Ù×÷£¬ËüÓÃÓÚе÷¶à¸öʵÌåÖ®¼äµÄ¹ØÏµ£¬´¦Àí¸÷ÀàµÄÒµÎñÎÊÌâ;ÔÚÓ¦ÓÃ²ã£¨ÌØ±ðÊÇÔÚ·Ö²¼Ê½¿ª·¢ÏµÍ³ÄÚ£©£¬·þÎñ¶àÒÔWeb
Service¡¢TCP/IPÌ×½Ó×Ö¡¢MSMQµÈµÈ·½Ê½ÊµÏÖ£¬·þÎñÔÚ´Ë´¦»á×÷Ϊһ¸öÓëÍâ½çͨѶµÄ½Ó¿Ú;
±¸×¢ £ºÕâÀïÃæÒ²´æÔÚÒ»¶¨µÄÕùÒ壬Eric ÈÏΪʵÌåËù´ú±íµÄÖ»ÊǶà¸ö¶ÔÏóÖ®¼äµÄ¹ØÏµ£¬¶øËüÃǵ͝×÷½«»áÓÉ·þÎñÀ´ÌåÏÖ³öÀ´£¬Õâ±»³ÆÎªÆ¶ÑªÐÍÄ£ÐÍ¡£µ«ÔÚ¿ª·¢¹ý³ÌÖУ¬Ô½À´Ô½¶àÈË»á°Ñ¶¯×÷¼ÓÈ뵽ʵÌåÀïÃæ£¬Õâ±»³ÆÎª³äѪÐÍÄ£ÐÍ¡£Æäʵ²»Í¬µÄÎÊÌâÓ¦¸Ã¿Í¹Û·ÖÎö£¬·Ö±ð¶Ô´ý£¬ÔÚÕâ¸öÀý×ÓÀïÃæ½«»áÒÔ°´ÕÕ
Eric µÄ¶¨ÒåÀ´¿ª·¢·þÎñ£¬ÔÚºóÃæµÄ¿ª·¢¹ý³ÌÖдó¼ÒÒ²¿ÉÒÔ´ÓÖÐÌåÏÖһϷþÎñ²ãËù´øÀ´µÄºÃ´¦¡£

2. ʵÀý˵Ã÷
ÏÈÒÔADO.NET Entity FrameworkʵÏÖÄ£ÐÍ£¬Person¡¢Order·Ö±ðÊôÓÚÁ½¸öʵÌ壬ËüÃǶ¼½«¼Ì³ÐRoot½Ó¿Ú£¬ÔÚËüÃǵÄÉúÃüÖÜÆÚÄÚ¶¼»áÉú³ÉÒ»¸öGuid×÷Ϊ±êÖ¾¡£´Ë´¦°ÑOrderItem×÷Ϊһ¸öÖµ¶ÔÏóÖÃÓÚOrderʵÌåÄÚ£¬ÕâÒâζ×ÅOrderItem»áͨ¹ýOrderÀ´»ñÈ¡£¬Íâ½ç²»ÄÜ¿çÔ½OrderÖ±½Ó»ñÈ¡OrderItem¡£µ±È»ÕâÓ¦¸ÃÓɾßÌåµÄÒµÎñÇé¿öÀ´È·¶¨£¬µ±Íâ½çÐèÒªµ¥¶Àµ÷ÓÃOrderItemÀàµÄʱºò£¬¾ÍÓ¦¸Ã¿¼ÂǰÑOrderItem¶ÀÁ¢³ÉΪһ¸öʵÌåÀà¡£
ÔÚÕâÀï¿ÉÀûÓ÷ֲ¿ÀàΪʵÌåÔö¼ÓGuidÊôÐÔ£¬¹ØÓÚ·Ö²¿ÀàÓÚ·Ö²¿·½·¨µÄÏêϸ½éÉܿɲο¼C#×ۺϽÒÃØ¡ª¡ª·Ö²¿ÀàºÍ·Ö²¿·½·¨
namespace Business.DomainModel
{
public interface Root {
}
public partial class Order:Root
{
private Guid _guid;
public Order()
{
_guid = System.Guid.NewGuid();
}
//Ϊ¸ù¶ÔÏóÉèÖÃΨһµÄGuid;
public Guid GUID
{
get { return _guid; }
}
}
public partial class Person:Root
{
public Person()
{
_guid = System.Guid.NewGuid();
}
//Ϊ¸ù¶ÔÏóÉèÖÃΨһµÄGuid;
private Guid _guid;
public Guid GUID
{
get { return _guid; }
}
}
} |
ËÄ¡¢Ï¸ËµRepository
1.¸ÅÄî
RepositoryÊǰѳ־û¯¶ÔÏóת»»³ÉÁìÓòÄ£Ð͵ÄÒ»ÖÖ·½Ê½£¬¿ÉÓÃÓÚ»ñÈ¡¡¢¸üг־öÔÏó²¢¹ÜÀíËüÃǵÄÉúÃüÖÜÆÚ¡£ËüʹӦÓóÌÐòÓë³Ö¾Ã»¯¼¼ÊõʵÏÖ½âñ³ÌÐòÎÞÐèÊÜÖÆÓÚʹÓÃOracle»¹ÊÇMySqlÊý¾Ý¿â£¬Ò²²»»áÊܵ½Hibernate¡¢LINQ¡¢ADO.NETµÈÊý¾Ý²ãµÄÔ¼Êø£¬Ê¹¿ª·¢ÈËÔ±¿ÉÒÔ°Ñ×¢ÒâÁ¦¼¯Öе½ÁìÓòÄ£Ð͵±ÖС£
RepositoryÓ봫ͳÈý²ãģʽµÄDAL²ãÓеãÏàËÆ£¬µ«RepositoryÕë¶ÔµÄÊÇÿһ¸ö¸ù¶ÔÏóÀ´»®·Ö±ß½çµÄ¡£ÔÚÕâ¸öÀý×Óµ±ÖУ¬PersonÓëOrder¶¼»áÓжÔÓ¦µÄPersonRepository¡¢OrderRepository¡£¶øOrderItemÖ»ÊÇOrderµÄ×ÓÊôÐÔ£¬ËùÒÔËüµÄ²åÈë¡¢¸üС¢É¾³ý¶¼»á°üº¬ÔÚOrderRepositoryµ±ÖС£µ±¶à¸ö¶ÔÏóÖ®¼ä½¨Á¢ÆðÁªÏµºó£¬¹ØÏµ½«ÊǸ´Ôӵģ¬ÌرðÊÇÔÚLINQÀïÃæ£¬³ÌÐò¿ÉÒÔÇáÒ×ͨ¹ýPersonµÄµ¼º½ÊôÐÔÀï»ñÈ¡OrderItemµÄÖµ£¬×îºóºÜÈÝÒ×ʹ´úÂë±äµÃ»ìÂÒ¡£ËùÒÔÈ·Á¢RepositoryµÄ±ß½ç£¬¿ÉÒÔÔÚÓÐЧ¹ÜÀíÿ¸öRepositoryµÄÖ°ÄÜ¡£
2.ʵÀý˵Ã÷
×¢ÒâOrderItemµÄ´æÈ¡¡¢É¾³ý¶¼°üº¬ÔÚOrderRepositoryÀïÃæ¡£ÔÚ»ñÈ¡¡¢ÐÞ¸ÄOrderµÄʱºò£¬Ò²»áÀûÓá°ÏÔʽ¼ÓÔØ¡±
context.Order.Include("OrderItem") µÄ·½·¨,ʹOrderItemʵÏÖͬ²½¸üС£¶øÍ¨¹ýPersonRepository.GetPerson£¨int
)»ñÈ¡µÄPerson¶ÔÏó£¬ËüÄÚ²¿µÄOrderÊôÐÔ½«ÊÇnullÖµ£¬Õâ±ØÐëÇåÎú°´ÕÕÁìÓòÄ£Ð͵ı߽绮·ÖµÄ¡£
µ±LINQÃæÊÀÒÔºó£¬Êý¾ÝµÄ»ñÈ¡±äµÃ¼òµ¥£¬ÌرðÔÚһЩСÐ͵Äϵͳ¿ª·¢Ê±£¬ºÜ¶àÈ˻᲻×Ô¾õµØ°ÑÕâÖÖÁìÓòÄ£ÐÍµÄ·Ö½ç¹æÔò´òÆÆ¡£µ«Ëæ×ÅϵͳµÄ¸´ÔÓ»¯£¬ÎÊÌâ¾Í»áÖð½¥³ÊÏÖ¡£±ÈÈçµ±Order¶ÔÏóµÄÊôÐÔ±»¸üУ¬Ê¹ÓÃOrderRepository.Update£¨Order)¸üÐÂÊý¾Ý¿âºó£¬Ò³ÃæµÄPerson¶ÔÏóδÄÜͬ²½ÊµÏÖ¸üУ¬ÔÚPersonÓëÊý¾Ý¿â½»»»Êý¾ÝµÄʱºò£¬OrderÓÖ±»±ä»Ø¾ÉÖµ¡£
ÔÚ»ìÂÒµÄÊý¾Ý²ã¿ª·¢ÖУ¬ÕâÖÖÇé¿ö·Ç³£³£¼û£¬ËùÒÔÔÚÏ»á¼á³ÖRepositoryµÄÔÔò£¬°ÑRepositoryµÄÖ°ÄÜÇåÎú°´ÕÕÁìÓòÄ£ÐÍ»®·Ö¡£
namespace Business.IRepository
{
public interface IOrderRepository
{
Order GetOrder(int id);
IList GetList();
IList GetListByPerson(int personID);
int AddOrder(Order order);
int DeleteOrder(int id);
int UpdateOrder(Order order);
int AddOrderItem(OrderItem orderItem);
int DeleteOrderItem(int id);
}
public interface IPersonRepository
{
int AddPerson(Person person);
int AttachPerson(Person person);
int UpdatePerson(Person person);
Person GetPerson(int id);
IList GetList();
}
}
namespace Business.Repository
{
public class OrderRepository:IOrderRepository
{
//¸ù¾ÝID»ñÈ¡µ¥¸öOrder
public Order GetOrder(int id)
{
BusinessContext _context = new BusinessContext();
Order order = null;
try
{
using (TransactionScope scope = new TransactionScope())
{
//ÓÉÓÚOrderItemÊÇOrderʵÌåÖеÄÒ»¸öÊôÐÔ£¬±ØÐëͨ¹ýOrderRepositoryͬ²½»ñÈ¡
var list = _context.Order.Include("OrderItem")
.Where(x => x.ID == id);
if (list.Count() > 0)
order = list.First();
else
order = new Order();
scope.Complete();
}
}
catch (Exception ex)
{
//³ö´í´¦Àí£¬²¢·µ»ØÒ»¸ö¿Õ¶ÔÏó
Business.Common.ExceptionManager.DataException .DealWith(ex);
order = new Order();
}
_context.Dispose();
return order;
}
..................
..................
}
public class PersonRepository:IPersonRepository
{
public int AddPerson(Person person)
{
return LinqHelp.Add(person);
}
public Person GetPerson(int id)
{
return LinqHelp.Get(id);
}
.................
.................
}
} |
ÔÚ¸üÐÂOrderÕâÖÖ¸´ÔÓµÄÁìÓòÄ£ÐÍʱ£¬Èç¹ûÒª·Ö±æµ¥¸öOrderItemÊôÐÔÊÇн¨Öµ»¹ÊǸüÐÂÖµ£¬È»ºó·Ö±ð´¦Àí£¬Äǽ«ÊDZȽÏÂé·³µÄ£¬¶øÇÒOrderItemÖ»ÊÇÒ»¸öÖµ¶ÔÏó£¬ID±àÂëµÈÊôÐÔ¶ÔËüûÓÐÈκÎʵÔÚÒâÒå¡£ËùÒÔÔÚ¸üÐÂList<OrderItem>ÊôÐÔʱ¶¼»áÏȰÑËüÈ«²¿É¾³ý£¬È»ºóÖØÐ¼ÓÔØ£¬ÔÚOrderItemÊýÁ¿²»¶àµÄʱºò£¬ÕâÊÇÒ»ÖÖÊ®·ÖÓÐЧµÄ·½·¨¡£
namespace Business.Repository
{
public class OrderRepository:IOrderRepository
{
.................
.................
//¸üÐÂOrder£¬ÒòΪÄÑÒÔ±ðÄÄЩÊÇÔÓеÄOrderItem, ÄÄЩOrderItemÊÇвåÈë
//ʹÓüòµ¥µÄ·½·¨£¬»áÏȰÑÔÓеÄOrderItemµÄɾ³ý£¬ÔÙÖØÐ²åÈë
public int UpdateOrder(Order order)
{
int returnValue = -1;
BusinessContext _context = new BusinessContext();
try
{
using (TransactionScope scope = new TransactionScope())
{
var list = _context.Order.Include("OrderItem")
.Where(x => x.ID == order.ID);
if (list.Count() > 0)
{
//¸üÐÂOrderÁÐ
Order _order = list.First();
_order.Count = order.Count;
_order.Delivery = order.Delivery;
_order.Favorable = order.Favorable;
_order.Freightage = order.Freightage;
_order.OrderNumber = order.OrderNumber;
_order.PersonID = order.PersonID;
_order.Price = order.Price;
_order.TotalPrice = order.TotalPrice;
//ɾ³ýÔÓеĶ©µ¥Ã÷ϸÏîOrderItem
if (list.First().OrderItem.Count != 0)
foreach (var item in list.First().OrderItem)
DeleteOrderItem(item.ID);
//¼ÓÈëÐµĶ©µ¥Ã÷ϸÏîOrderItem
if (order.OrderItem.Count != 0)
{
foreach (var item in order.OrderItem)
{
var _orderItem = new OrderItem();
_orderItem.Count = item.Count;
_orderItem.Goods = item.Goods;
_orderItem.OrderID = item.OrderID;
_orderItem.Price = item.Price;
AddOrderItem(_orderItem);
}
}
returnValue = _context.SaveChanges();
}
else
returnValue = 0;
scope.Complete();
}
}
catch (Exception ex)
{
Business.Common.ExceptionManager.DataException. DealWith(ex);
returnValue=-1;
}
_context.Dispose();
return returnValue;
}
//²åÈëOrderItem
public int AddOrderItem(OrderItem orderItem)
{
return LinqHelp.Add(orderItem);
}
//ɾ³ýOrderItem
public int DeleteOrderItem(int id)
{
EntityKey key = new EntityKey("BusinessContext.OrderItem",
"ID", id);
return LinqHelp.Delete(key);
}
}
} |
Îå¡¢ÁìÓò²ãµÄ·þÎñ
1. Àý×Ó˵Ã÷
ÔÚµÚ¶þ½ÚÒÑ»ù±¾½éÉܹý·þÎñµÄ×÷ÓÃÁË£¬ÁìÓò²ã·þÎñµÄ×÷ÓÃÖ÷ÒªÊÇΪÁ˽â¾öÒµÎñÉϵÄÂß¼ÎÊÌ⣬¸ü¶àµÄʱºò£¬·þÎñÊÇÒ»¸öÓëÒµÎñÏà¹ØµÄ¶¯×÷¡£±ÈÈçÔÚÉÏÊöÀý×ÓÖУº
ÔÚOrder±íÀï¼Ç¼µÄÊÇÿ´Î½»Ò׵Ĺý³Ì£¬Ã¿´ÎÉÌÆ·µÄËÍ»õ·Ñ£¨Freightage£©Îª10Ôª£¬µ±ÉÌÆ·¼Û¸ñ£¨Price£©³¬¹ý98Ôª¿ÉÃâ·ÑËÍ»õ£¬µ±Óû§
Person»ý·Ö£¨Point£©³¬¹ý2000·Ö¿É»ñ7ÕÛÓŻݣ¨Favorable£©£¬1000~2000·Ö¿É»ñ8ÕÛ£¬1000·ÖÒÔÏ¿ÉÓÐ9ÕÛ£¬×îºó×ÜÌå¼Û
¸ñΪΪ£¨TotalPrice£©¡£
Õ⸴ÔÓµÄÒµÎñÂß¼£¬ÍêÈ«¿ÉÒÔÓÉÒ»¸öÁìÓò·þÎñÀàAccountManagerÀ´Íê³É
namespace Business.Service.DomainService
{
public class AccountManager
{
private Person _person;
private Order _order;
public AccountManager(Person person, Order
order)
{
_person = person;
_order = order;
}
///¼ÆËã×ÜÌåÊÕ·Ñ
public void Account()
{
//¼ÆËãÉÌÆ·ÊýÁ¿
GoodsCount();
//¼ÆËãÉÌÆ·¼Û¸ñ
PriceAccount();
//¼ÆËãÓŻݵȼ¶
FavorableAccount();
double price1 = (_order.Price - _order.Favorable).Value;
//¼ÆËãÔË·Ñ
FreightageAccount(price1);
//¼ÆËã×ÜÌå¼Û·Ñ
_order.TotalPrice = price1 + _order.Freightage.Value;
}
//¼ÆËãÉÌÆ·ÊýÁ¿
private void GoodsCount()
{
_order.Count=0;
foreach (var OrderItem in _order.OrderItem)
_order.Count += OrderItem.Count;
}
//ÉÌÆ·×ÜÌå¼Û¸ñ
private void PriceAccount()
{
_order.Price = 0;
foreach (var OrderItem in _order.OrderItem)
_order.Price += OrderItem.Price * OrderItem.Count;
}
//ÓŻݷÖΪÈýµÈ£¬»ý·ÖСÓÚ1000ÓÐ9ÕÛ£¬Ð¡ÓÚ2000·ÖΪ8ÕÛ£¬´óÓÚ2000Ϊ7ÕÛ
private void FavorableAccount()
{
int point = (int)_person.Point.GetInt();
if (point < 1000)
_order.Favorable = _order.Price * 0.1;
if (point >= 1000 && point < 2000)
_order.Favorable = _order.Price * 0.2;
if (point > 2000)
_order.Favorable = _order.Price * 0.3;
}
//Èç¹û¼Û¸ñÔÚ98ÔªÒÔÉÏ£¬¿ÉÃâÔË·Ñ¡£ÆäÓàÔË·ÑΪ10Ôª
private void FreightageAccount(double price)
{
if (price >= 98)
_order.Freightage = 0;
else
_order.Freightage = 10;
}
}
} |
Äã¿ÉÄÜ»á˵£¬ÔÚÕâ¸öÒµÎñÁ÷³ÌÖУ¬³ýÁË»ý·ÖÓÅ»ÝPerson.PointÒÔÍ⣬ÆäËûµÄÒµÎñ¶¼Ö»ÓëOrderµÄÊôÐÔÓйأ¬°´ÕÕ³äѪÐÍÄ£Ð͵ķ½°¸£¬ÍêÈ«¿ÉÒÔ°ÑÕâЩҵÎñ·Åµ½OrderµÄ·½·¨µ±ÖУ¬¶ø°Ñ»ý·ÖÓŻݶÀÁ¢³ÉΪһ¸ö·þÎñ¡£µ«ÔÚÏÂÔںܶàµÄ¿ª·¢¹ý³ÌÖз¢ÏÖ£¬ÎªÄ£Ð͸½É϶¯×÷»á´øÀ´Ò»Á¬´®µÄÎÊÌ⣬ºÃÏñÄã²»ÖªµÀÄÄЩ²Ù×÷Ó¦¸ÃÔÚÄ£ÐͶ¯×÷ÉÏʵÏÖ£¬ÄÄÀïÓ¦¸ÃÔÚ·þÎñÖÐʵÏÖ......¡£¶ÔÓÚÕâЩÎÞÐÝÖ¹µÄÕùÂÛ²»»áÒòΪÕâÀïµÄÒ»¸öСÀý×Ó¶øÍ£Ö¹£¬µ«ÔÚÕâÀïÎÒ»á¼á³ÖʹÓÃÆ¶ÑªÐÍÄ£ÐÍ,ÀûÓ÷þÎñÀ´Íê³ÉËùÓе͝×÷¡£
ÔÙ¾ÙÒ»¸öÀý×Ó£ºÔÚ×îºó½áµ¥µÄʱºòOrder±íÀï»á²úÉú¶©µ¥ºÅÂëOrderNumberºÍ϶©ÈÕÆÚDelivery£¬Person±íµÄ»ý·ÖÒ²»á¼ÓÉ϶©µ¥×ܼ۵ĵãÊý¡£¶ÔÓ¦Õâ¸ö²Ù×÷£¬Ò²¿ÉÒÔµ¥¶À¿ª·¢Ò»¸öPaymentManager·þÎñÀà½øÐйÜÀí¡£
namespace Business.Service.DomainService
{
public class PaymentManager
{
//ϵ¥½áËã
public void Payment(Order order,Person person)
{
//È·¶¨Ïµ¥£¬½¨Á¢¶©µ¥ºÅ
order.OrderNumber = Guid.NewGuid().ToString();
order.Delivery = DateTime.Now;
//Ôö¼Ó»ý·Ö
if (person.Point.HasValue)
person.Point += (int)order.TotalPrice.GetValueOrDefault();
else
person.Point = (int)order.TotalPrice.GetValueOrDefault();
}
}
} |
ÀûÓÃÁìÓò²ãµÄ·þÎñ£¬Ê¹µÃÿ¸öManager·þÎñÀàµÄÖ°Äܷdz£Ã÷È·£¬ÒµÎñ¹ÜÀíÆðÀ´Ò²Ê®·ÖµØ·½±ã£¬ÁìÓò²ã¿ÉÒÔËæ×ÅÒµÎñµÄ¸Ä±ä¶øÁé»î±ä¶¯¡£¶øÇÒÁìÓò²ã¾ßÓÐ
¡°¸ßÄÚ¾Û£¬µÍñîºÏ¡± ÌØÐÔ£¬Ëü²¢²»ÒÀÀµÆäËüÈκÎÒ»²ã£¬¶øÖ»ÊǰÑÒµÎñÂß¼°üº¬ÔÚÀïÃæ¡£
Áù¡¢¹¤³§Ä£Ê½Factory
FactoryÊdz£Óõ½Èí¼þ¿ª·¢Ä£Ê½£¬ÔÚÍøÉÏÏñ¼òµ¥¹¤³§¡¢¹¤³§·½·¨¡¢³éÏ󹤳§µÈ¿ª·¢Ä£Ê½µÄ×ÊÁ϶¼µ½´¦¿ÉѰ£¬¿ÉÕâ²¢²»ÊÇÁìÓòÇý¶¯Éè¼ÆµÄÖ÷Ìâ¡£ÔÚÕâÒ»½ÚÀÎÒÖ÷ÒªÏë½éÉÜFactoryµÄÊÊÓÃʱ»ú¡£
²¢·ÇÉú³ÉËùÓжÔÏóµÄʱºò£¬¶¼ÐèÒªÓõ½¹¤³§Ä£Ê½¡£ÔÚÉú³É¼òµ¥¶ÔÏóµÄʱºò£¬¿ÉÒÔÖ±½ÓÀûÓù¹Ô캯ÊýÀ´´úÌæ¹¤³§£¬Ò²¿ÉÒÔÌí¼Ó¹¤³§·½·¨À´Éú³É¶ÔÏó¡£µ«Èç¹ûÔÚÉú³É¶ÔÏóʱ£¬ÄÚ²¿ÊôÐÔÖ®¼ä´æÔÚһϵͳ¸´ÔÓµÄÒµÎñ¹æÔòµÄʱºò£¬¾Í¿ÉÒÔ°ÑÉú³É·½·¨¶ÀÁ¢µ½Ò»¸öFactoryÀàÀïÃæ¡£Õâʱºò¿Í»§¶ËÎÞÐèÀí»áDZÔÚÂß¼¹ØÏµ£¬¶øÖ±½Óͨ¹ýÕâ¸öFactoryÀ´Éú³ÉÏàÓ¦µÄ¶ÔÏó¡£
¾Ù¸öÀý×Ó£¬ÔÚн¨OrderµÄʱºò£¬ÒµÎñÉϹ涨ÔË·ÑÊÇ×ÜÌå½ð¶îµÄ1%£¬Õۿ۹涨ÊÇ7.5ÕÛ......
¡£Èç¹ûÓɿͻ§¶Ëн¨Ò»¸ö¶ÔÏóOrder£¬È»ºóΪÕâЩÊôÐÔ¸ºÖµ£¬ÄÇÏà¹ØµÄÒµÎñÂß¼¾Í»á±©Â¶ÔÚÍâ¡£Õâʱºò¾Í¿ÉÒÔʹÓÃFactoryģʽ£¬°ÑÊôÐÔÖ®¼äµÄ¹ØÏµ·â×°µ½FactoryÖ®ÄÚ£¬¿Í»§¶Ëͨ¹ýFactory¾ÍÄÜÇáËɵØÉú³ÉOrder¶ÔÏó¶øÎÞÐèÒªÀí»á¸´ÔÓµÄÄÚ²¿¹ØÏµ¡£

ÖÁÓڽϸ´ÔÓµÄFactoryģʽ£¬Ôڴ˲»¶à×÷½éÉÜ£¬¸÷λ¿ÉÒÔÔÚÍøÉϲéÕÒÏà¹Ø×ÊÁÏ¡£
Æß¡¢Ï¸ËµÓ¦Óòã
1. SOAϵͳÖÐÓ¦ÓòãµÄÌØµã
ÔÚ¿ª·¢SOA·Ö²¼Ê½ÏµÍ³µÄʱºò£¬Ó¦ÓòãÊÇÒ»¸öÖØµã£¬ËüÖ÷ÒªÓÐÁ½¸ö×÷Óá£
µÚÒ»£¬Ó¦ÓòãÖ÷Òª×÷ÓÃÊÇе÷ÁìÓò²ã¹¤×÷£¬Ö¸»ÓÁìÓò¶ÔÏó½â¾öÒµÎñÎÊÌ⣬µ«Ó¦Óò㱾Éí²»»áÇ£³¶µ½ÒµÎñ״̬¡£
µÚ¶þ£¬ÔÚSOAϵͳµ±ÖÐÓ¦ÓòãÊÇÊý¾ÝÔËÊäÖÐÐĺÍÐÅÏ¢·¢·ÅµÄ¶Ë¿Ú£¬µ£¸º×ÅÊý¾Ýת»»ÓëÊý¾ÝÊÕ·¢µÄÔðÈΡ£
ËüÓÐÒÔϵÄÌØµã£º
1¡¢´ÖÁ£¶È
·Ö²¼Ê½ÏµÍ³ÓëÆÕÍ¨ÍøÕ¾ºÍÓ¦ÓóÌÐò²»Í¬£¬ÒòΪËü¼Ù¶¨Íâ½ç¶ÔϵͳÄÚ²¿ÊǺÁÎÞÁ˽âµÄ£¬Óû§Ö»ÏëÊäÈëÏà¹ØÊý¾Ý£¬×îºóµÃµ½Ò»ÏµÁмÆËã½á¹û¡£ËùÒÔÎÒÃÇÓ¦¸Ã°Ñ¼ÆËã½á¹û·â×°ÔÚÒ»¸öÊý¾Ý´«Êä¶ÔÏó£¨DTO£©ÄÚ£¬ÊµÏÖ´ÖÁ£¶ÈµÄ´«µÝ£¬ÕâÊÇÒ»°ãÏîÄ¿ÓëSOAϵͳÔÚ·þÎñ²ãµÄÒ»¸ö×îÃ÷ÏԵIJî±ð¡£
ÏëÏëÈç¹ûÒ»¸öÒ³ÃæÐèҪͬʱÏÔʾһ¸ö¹Ë¿ÍµÄ¸öÈË×ÊÁÏ¡¢Ä³ÕŶ©µ¥µÄÏêϸ×ÊÁÏ£¬Äǽ«ÒªÍ¬Ê±»ñÈ¡Person¡¢Order¡¢OrderItemÈýÕűíµÄÐÅÏ¢¡£ÔÚÆÕͨϵͳµÄ¿ª·¢¹ý³ÌÖУ¬Õâ²¢²»»áÔì³ÉÌ«´óÎÊÌ⣬µ«ÔÚʹÓÃÔ¶³Ì·þÎñµÄʱºò£¬Èç¹ûÓÃÈý¸ö·½·¨·Ö±ð»ñÈ¡£¬Äǽ«»áÔì³É²»ÉÙµÄÐÔÄÜËðºÄ¡£ÌرðÊÇÔÚ·Ö²¼Ê½¿ª·¢ÏµÍ³ÖУ¬Ó¦ÓòãÓë±íÏÖ²ãÖ®¼äÊÇʵÏÖ·ÖÀëµÄ£¬¸ü¶àʱºòÁ½ÕßÊÇÓɲ»Í¬²¿ÃÅËù¿ª·¢µÄÄ£¿é£¬±íÏֲ㲻»áÁ˽âÓ¦ÓòãÖеÄÂß¼¹ØÏµ£¬Person£¬Order£¬OrderItemÈýÑù¶«Î÷ÔÚ±íÏֲ㿴À´£¬Ò²¾ÍÊÇͬһÑù¶«Î÷£¬ÄǾÍÊÇ·µ»ØÖµ¡£ËùÒÔÔÚϵͳÄÚ£¬Ó¦¸Ã°Ñ¶àÕűíµÄÐÅÏ¢·â×°ÔÚÒ»¸öDTO¶ÔÏóÄÚ£¬Í¨¹ýÓ¦ÓòãÒ»¸öÔ¶³Ì·½·¨Ò»´ÎÐÔ·µ»¹¡£Ê¹ÓôÖÁ£¶ÈµÄÊý¾ÝÔªËØÊÇ·Ö²¼Ê½ÏµÍ³µÄÒ»¸öÌØµã¡£
2¡¢ ´«ÊäÐÔ
Èç¹ûÄãÊìϤSOAϵͳ£¬¶ÔDTO£¨Data Transfer Object
Êý¾Ý´«Êä¶ÔÏó£©Õâ¸ö´ÊÒ»¶¨²¢²»Ä°Éú¡£DTOÊôÓÚÒ»¸öÊý¾Ý´«ÊäµÄÔØÌ壬ÄÚ²¿²¢²»´æÔÚÈκÎÒµÎñÂß¼£¬Í¨¹ýDTO¿ÉÒÔ°ÑÄÚ²¿µÄÁìÓò¶ÔÏóÓëÍâ½ç¸ôÀë¡£DTOËù·â×°µÄÊǿͻ§¶ËµÄÊý¾Ý£¬ËùÒÔËüµÄÉè¼Æ¸ü¶àµØÊÇÕë¶Ô¿Í»§¶ËµÄÐèÇ󣬶ø²»ÊÇÒµÎñÂß¼¡£±ÈÈç˵±¾À´PersonÓëOrderÊÇÒ»¶Ô¶àµÄ¹ØÏµ£¬µ«µ±Ò»¸öÒ³ÃæÖ»ÒªÏÔʾµÄÊÇÒ»¸ö¿Í»§µÄµ¥ÕŶ©µ¥ÐÅÏ¢£¬ÄÇÎÒÃǾͿÉÒÔ¸ù¾ÝÐèÒª°ÑDTOÖеÄPersonºÍOrderÉè¼ÆÎªÒ»¶ÔÒ»µÄ¹ØÏµ¡£Èç¹ûÄãÊÇʹÓÃMVC¿ª·¢Ò»°ãµÄÍøÕ¾£¬¸ü¶àʱºò»á°Ñ·µ»Ø¶ÔÏóÖ±½Óת»¯ÎªModel¡£Èç¹ûÄ㿪·¢ÊÇÒ»¸ö·Ö²¼Ê½ÏµÍ³£¬ÄǸü¶àʱºò»á´ÓϵͳÐÔÄÜÓëÒþ²ØÒµÎñÂß¼³ö·¢×ÅÏë¡£¶øÇÒ¿¼Âǵ½°ÑÄÚ²¿¶ÔÏóת»¯ÎªDTO£¬½«ÊÇÒ»¼þÂé·³µÄÊ£¬½¨ÒéÓ¦¸Ã¿¼ÂÇDTOµÄ¼æÈÝÐÔ£¬Ê¹DTO¿ÉÒÔ×÷Ϊ¶à¸ö·½·¨µÄ·µ»¹ÔØÌå¡££¨×¢Ò⣺ÔÚSOAϵͳÄÚ£¬Ó¦¸Ã´ÓÐÔÄܳö·¢ÓÅÏÈ¿¼ÂÇ´ÖÁ£¶ÈÔªËØµÄ´«ÊäÐÔÎÊÌ⣩
3¡¢ ·â×°ÐÔ
ÔÚSOAϵͳµ±ÖÐÓ¦Óòã·þÎñµÄ·¢²¼²¢²»ÐèÒª¸´ÔÓµÄÄ£ÐÍ£¬Ö»ÐèʹÓÃÍâ¹Ûģʽ£¨Facade£©°ÑһЩ¹¦ÄÜ·â×°ÔÚÉÙÊýµÄ¼¸¸ö·þÎñÀàÀïÃæ£¬Ê¹ÓÃWeb
Service¡¢TCP/IPÌ×½Ó×Ö¡¢MSMQµÈ·þÎñ·½Ê½ÏòÍâ½ç·¢²¼¡£
˵µ½ÕâÀÎÒÕæµÄÊ®·Ö¸Ð¼¤MartinÏÈÉú´ø¸øÎҵİïÖú£¬ÔÚ¿ª·¢¹ý³ÌÖУ¬ÕâЩ¸´ÔÓµÄÎÊÌâ´ø¸øÎÒ²»ÉÙµÄÀ§ÈÅ£¬MartinÏÈÉúÒ»Ö½¸»ÓоÑéµÄ¶ÀÌØ¼û½â£¬ÕæµÄ´ø¸øÔÚϺܴóµÄÆô·¢¡£
2. Ó¦ÓòãµÄе÷ÐÔ
Ó¦Óòã·þÎñ»áÀûÓÃRepository£¬Íê³ÉʵÌå»ù±¾µÄ²åÈë¡¢¸üС¢»ñÈ¡µÈµÈ²Ù×÷£¬²¢µ÷ÓÃÁìÓò²ãµÄ·þÎñ¹ÜÀíµÄÒµÎñÂß¼¡£×¢Òâ¹Û²ì£¬Ò»ÇеÄÒµÎñÂß¼¶¼Ö»»áÒþ²ØÓÚÁìÓò²ã£¬Ó¦Óòã·þÎñÖ»Æð×Åе÷×÷Ó㬱¾Éí²»Ó¦¸Ã°üº¬ÓÐÈκÎÒµÎñÂß¼¡£
¿ÉÒÔ¿´µ½OrderService¾ÍÊÇͨ¹ýµ÷ÓÃAccountManager¡¢PaymentManagerµÈÁìÓò²ã·þÎñÀ´Íê³É½áÕË¡¢¸¶¿îµÈһϵÁи´ÔÓÒµÎñÂß¼µÄ¡£
namespace Business.Service.ApplicationService
{
public class PersonService
{
private IPersonRepository personRepository = DataAccess.CreatePersonRepository();
public int AddPerson(Person person)
{
return personRepository.AddPerson(person);
}
public int UpdatePerson(Person person)
{
return personRepository.UpdatePerson(person);
}
public Person GetPerson(int personID)
{
return personRepository.GetPerson(personID);
}
public IList GetList()
{
return personRepository.GetList();
}
}
public class OrderService
{
private IOrderRepository orderRepository = DataAccess.CreateOrderRepository();
public int AddOrder(Order order)
{
//¼ÆËãOrder×ÜÌå·ÑÓÃ
Account(order);
//¼ÓÈëÐ޸ĺóµÄOrder
return orderRepository.AddOrder(order);
}
//µ÷ÓÃÁìÓò²ã·þÎñAccountManager£¬¼ÆËãOrder×ÜÌå·ÑÓÃ
private void Account(Order order)
{
//»ñÈ¡¶ÔÓ¦Person¶ÔÏó
IPersonRepository personRepository = DataAccess.CreatePersonRepository();
Person person = personRepository.GetPerson(order.PersonID);
//µ÷Ó÷þÎñ²ãµÄAccountManager¶ÔÏ󣬼ÆËã·ÑÓã¬ÐÞ¸ÄOrder
AccountManager accountManager = new AccountManager(person,
order);
accountManager.Account();
}
//µ÷ÓÃÁìÓò²ã·þÎñPaymentManager£¬È·È϶©µ¥
public Order Payment(int orderID)
{
var order=orderRepository.GetOrder(orderID);
if (order != null)
{
PersonRepository personRepository = new PersonRepository();
var person=personRepository.GetPerson(order.PersonID);
PaymentManager paymentManager = new PaymentManager();
paymentManager.Payment(order, person);
orderRepository.UpdateOrder(order);
personRepository.UpdatePerson(person); return order;
}
else
throw new Exception("Can not find order!");
}
public int DeleteOrder(Order order)
{
return orderRepository.DeleteOrder(order.ID);
}
public Order GetOrder(int orderID)
{
return orderRepository.GetOrder(orderID);
}
public IList GetList()
{
return orderRepository.GetList();
}
public IList GetListByPerson(int personID)
{
return orderRepository.GetListByPerson(personID);
}
public int UpdateOrder(Order order)
{
Account(order);
return orderRepository.UpdateOrder(order);
} public int AddOrderItem(OrderItem orderItem)
{
int index = orderRepository.AddOrderItem(orderItem);
Order order = orderRepository.GetOrder(orderItem.OrderID);
UpdateOrder(order);
return index;
}
public int DeleteOrderItem(OrderItem orderItem)
{
int index = orderRepository.DeleteOrderItem(orderItem.ID);
Order order = orderRepository.GetOrder(orderItem.OrderID);
UpdateOrder(order);
return index;
}
.......................
.......................
}
} |
3. Êý¾Ýת»»¹ý³Ì
Ç°ÃæÒѾ½âÊÍÁËDTOµÄ×÷Ó㬵«ÊµÏÖÁìÓò¶ÔÏóÓëDTOÖ®¼äµÄת»»ÊÇÒ»¼þ¸´ÔÓµÄʼþ£¬Òò´Ë¿ÉÒÔ½¨Á¢Ò»¸öÊý¾Ýת»»Æ÷ʵÏִ˹¦ÄÜ¡£
ÔÚÆ½³£µÄ¹¤×÷À²»Ì«¶à»á°Ñ¡°¶©µ¥¹ÜÀíϵͳ¡±×ö³ÉSOAµÄģʽ£¬ÒòΪÔÚ·Ö²¼Ê½ÏµÍ³ÖУ¬Êý¾ÝµÄ¸ñʽÓ붨Òå´ó¶àÊýÓɲ¿ÃÅÖ®¼äж¨£¬ÆäÖаüº¬Ã÷È·µÄ¹æÔò¡£µ«ÓÉÓÚÌõ¼þµÄ¾ÖÏÞ£¬ÔÚÕâÀﻹÊÇÏëÒÔ¶©µ¥¹ÜÀíΪÀý×Ó£¬Ï£Íû¿ÉÒÔ´ø¸øÄãÒ»¶¨µÄ°ïÖú¡£Àý×ÓÈçÏ£ºÔÚ¹ºÎï³µ½áÕË£¬Ò³Ãæ»á°üº¬Óû§»ù±¾ÐÅÏ¢£¬µ±Ç°¶©µ¥ÐÅÏ¢£¬¶©µ¥Ã÷ϸÐÅÏ¢µÈ¶à¸ö²¿·Ö¡£

ÒªÍê³ÉÊý¾Ýת»»£¬Ê×ÏÈ¿ÉÒÔ¸ù¾ÝÒ³Ãæ½¨Á¢DTO¶ÔÏó£¬ÔÚ·Ö²¼Ê½ÏµÍ³ÖУ¬Í¨³£»á°ÑDTO¶ÔÏó·ÅÔÚÒ»¸ö¶ÀÁ¢µÄÃüÃû¿Õ¼äÀÔÚÕâ¸öʵÀýÀïÃæ³ÆÖ®ÎªBusiness.TransferObject¡£DTO¶ÔÏó¸ü¶àʱºòÊÇÃæÏò±íÏÖ²ãµÄÐèÇó¶ø½¨Á¢£¬ÕâÀïÓÉÓÚ±íÏÖ²ãÒ³ÃæËùÐèÒªµÄÖ»Êǵ¥¸öÓû§£¬µ¥ÕŶ©µ¥µÄÊý¾Ý£¬ËùÒÔÔÚOrderDTO¶ÔÏóÀï»á°üº¬ÁËÓû§ÐÅÏ¢ºÍ¶©µ¥×ÊÁÏ£¬Ò²´æÔÚ¶©µ¥ÏêϸÁÐList<OrderItemDTO>¡£µ±È»£¬DTOµÄÉè¼Æ¿ÉÒÔËæ×ÅÐèÇó¶øÐ޸ġ£
ÔÚSOAϵͳÀDTOÊÇÔ¶³Ì·þÎñÊý¾ÝµÄÔØÌ壬ËùÒÔ»á°ÑDTO¸½ÉÏ¿ÉÐòÁл¯ÌØÐÔ£¬Õâ´ËÀý×ÓÖлáʹÓÃWCFµÄÊý¾ÝÆõԼʵÏÖOrderDTOºÍOrderItemDTO¡£

Èçͼ£¬ÒªÊµÏÖÊý¾Ýת»»£¬¾ÍÓ¦¸Ã½¨Á¢Êý¾Ýת»»Æ÷¡£ÔÚÕâÀïOperationAssembler¾ÍÊÇÒ»¸öÊý¾Ýת»»Æ÷£¬ËüÊÇÊý¾Ýת»»µÄºËÐÄ£¬ËüÊÇÁìÓò¶ÔÏóÓëDTOÖ®¼äʵÏÖת»»µÄ¹¤¾ß¡£ÒªÔÚ¶à¸ö¶ÔÏóÖ®¼äʵÏÖÊý¾Ýת»»ÊµÔÚÊÇÒ»¼þ·Ç³£Âé·³µÄÊ£¬ËùÒÔÎÒÒ»Ö±ÌᳫעÒâDTO¶ÔÏóµÄ¼æÈÝÐÔ£¬Ê¹µ¥¸öDTO¶ÔÏó¿ÉÒÔÊÊÓÃÓÚ¶à¸öÍâ¹Û²ã£¬ÒÔ¼õÉÙÊý¾Ýת»»Ëù´øÀ´µÄÂé·³¡£
namespace Business.Service.ApplicationService
{
public class OperationAssembler
{
//°ÑÁìÓò¶ÔÏóת»»³ÉDTO
public static OrderDTO GetOrderDTO(Order order,Person
person)
{
OrderDTO orderDTO = new OrderDTO();
if (person != null)
{
orderDTO.EMail = person.EMail.GetString();
orderDTO.Address = person.Address.GetString();
orderDTO.Name = person.Name.GetString();
orderDTO.PersonID = person.ID;
orderDTO.Point = person.Point.GetInt();
orderDTO.Telephone = person.Telephone.GetString();
}
if (order != null)
{
orderDTO.PersonID = order.PersonID;
orderDTO.Count = order.Count.GetInt();
orderDTO.Delivery = order.Delivery.GetDateTime();
orderDTO.Favorable = order.Favorable.GetDouble();
orderDTO.Freightage = order.Freightage.GetDouble();
orderDTO.OrderID = order.ID;
orderDTO.OrderNumber = order.OrderNumber.GetString();
orderDTO.Price = order.Price.GetDouble();
orderDTO.TotalPrice = order.TotalPrice.GetDouble();
var orderItemList = order.OrderItem.ToList();
if (orderItemList.Count != 0)
{
var orderItemDTO = new List();
foreach (var orderItem in orderItemList)
orderItemDTO.Add(GetOrderItemDTO(orderItem));
orderDTO.OrderItemList = orderItemDTO;
}
}
return orderDTO;
}
public static OrderItemDTO GetOrderItemDTO(OrderItem
orderItem)
{
OrderItemDTO orderItemDTO = new OrderItemDTO();
orderItemDTO.Count = orderItem.Count.GetInt();
orderItemDTO.Goods = orderItem.Goods.GetString();
orderItemDTO.OrderID = orderItem.OrderID;
orderItemDTO.OrderItemID = orderItem.ID;
orderItemDTO.Price = orderItem.Price.GetDouble();
return orderItemDTO;
}
//°ÑDTOת»»³É¶à¸ö¶ÔÏó
public static void SetOrder(OrderDTO orderDTO,
out Person person, out Order order)
{
person = new Person();
person.EntityKey=new System.Data.EntityKey ("BusinessContext.Person","ID",orderDTO.PersonID);
person.Address = orderDTO.Address;
person.EMail = orderDTO.EMail;
person.ID = orderDTO.PersonID;
person.Name = orderDTO.Name;
person.Point = orderDTO.Point;
person.Telephone = orderDTO.Telephone;
order = new Order();
order.EntityKey=new System.Data.EntityKey("BusinessContext. Order","ID",orderDTO.OrderID);
order.Count = orderDTO.Count;
if (orderDTO.Delivery.Year!=0001&&orderDTO. Delivery.Year!=9999)
order.Delivery = orderDTO.Delivery;
order.Favorable = orderDTO.Favorable;
order.Freightage = orderDTO.Freightage;
order.ID = orderDTO.OrderID;
order.OrderNumber = orderDTO.OrderNumber;
order.PersonID = orderDTO.PersonID;
order.Price = orderDTO.Price;
order.TotalPrice = orderDTO.TotalPrice;
var orderItemDTOList = orderDTO.OrderItemList;
if (orderItemDTOList.Count() != 0)
foreach (var orderItemDTO in orderItemDTOList)
order.OrderItem.Add(GetOrderItem(orderItemDTO));
}
public static OrderItem GetOrderItem(OrderItemDTO
orderItemDTO)
{
OrderItem orderItem = new OrderItem();
orderItem.EntityKey = new System.Data.EntityKey("BusinessContext.OrderItem",
"ID", orderItemDTO.OrderItemID);
orderItem.Count = orderItemDTO.Count;
orderItem.Goods = orderItemDTO.Goods;
orderItem.ID = orderItemDTO.OrderItemID;
orderItem.OrderID = orderItemDTO.OrderID;
orderItem.Price = orderItemDTO.Price;
return orderItem;
}
}
}
//Êý¾Ý´«Êä¶ÔÏó DTO
namespace Business.TransferObject
{
[DataContract]
public class OrderItemDTO
{
private int _orderItemID;
private int _orderID;
private string _goods;
private double _price;
private int _count;
[DataMember]
public int OrderItemID
{
get { return _orderItemID; }
set { _orderItemID = value; }
}
............
............
}
[DataContract]
public class OrderDTO
{
private int _personID;
private string _name;
private string _address;
private string _telephone;
private int _point;
private string _email;
private int _orderID;
private string _orderNumber;
private int _count;
private double _freightage;
private double _favorable;
private DateTime _delivery;
private double _price;
private double _totalPrice;
private IList _orderItemDTOList;
[DataMember]
public int PersonID
{
get{return this._personID;}
set{this._personID=value;}
}
..........
..........
}
} |
ͨ¹ýÊý¾Ýת»»Æ÷£¬¿ÉÒÔ˳ÀûʵÏÖÁìÓòÄ£ÐÍÓëDTOÖ®¼äµÄת»»£¬Ðµ÷Ó¦Óòã·þÎñµÄÔËÐС£

4. Ó¦ÓòãµÄ·¢²¼
ÔÚ¿ª·¢SOAϵͳµÄʱºò£¬Ó¦ÓòãµÄ·þÎñÐèҪʹÓÃÔ¶³Ì·½·¨¶ÔÍ⿪·Å£¬ÔÚ½ÓÊÕµ½ÇëÇóµÄʱºò£¬Ëü¿ÉÒÔµ÷ÓÃÁìÓò²ã·þÎñ»ñÈ¡ÔËËã½á¹û£¬È»ºóͨ¹ýÊý¾Ýת»»Æ÷OperationAssembler°ÑÔËËã½á¹ûת»»³ÉDTO£¬×îºó·µ»¹µ½±íÏֲ㡣ÔÚÆð³õ£¬ÎÒÔø³¢ÊÔ¶ÔӦÿ¸öÓ¦ÓòãµÄ¶ÔÏó½¨Á¢Ò»¸öÔ¶³Ì½Ó¿Ú£¬µ«¾¹ý¶à´ÎÖØ¹¹ÒÔºó£¬ÎÒ¾õµÃÐг̶ÔÏó¾ÍÊÇÒ»¸ö¼òµ¥µÄ¶ÔÍâ½Ó¿Ú£¬¶ÔÏóÖ®¼ä²»´æÔÚʲôÂß¼¹ØÏµ¡£ËùÒÔ¸ü¼òµ¥µÄ·½·¨ÊÇʹÓÃÍâ¹Ûģʽ£¬½¨Á¢ÉÙÊýµÄ¼¸¸öÔ¶³Ì·þÎñÀ࣬°ÑËùÓеÄÓ¦Óòã¶ÔÏóµÄ·½·¨¶¼°üº¬ÔÚÄÚ¡£

¿ÉÒÔÁôÒâ´úÂ룬OperationService°üÀ¨Á˶ÔPersonÄ£ÐͺÍOrderÄ£Ð͵ÄËùÓвÙ×÷¡£¶øÇÒÿ¸ö²Ù×÷¶¼Ö»ÊǼòµ¥µØµ÷ÓÃÓ¦Óòã·þÎñ
(ApplicationService) »ñµÃ¼ÆËã½á¹û£¬È»ºóʹÓÃÊý¾Ýת»»Æ÷ £¨OperationAssembler£©×ª»»Êý¾Ý£¬µ±Öв¢²»´æÔÚÈκεÄÒµÎñÂß¼¡£
namespace Business.Service.ApplicationService
{
[ServiceContract]
public interface IOperationService
{
[OperationContract]
int AddOrder(ref OrderDTO orderDTO);
[OperationContract]
int DeleteOrder(OrderDTO orderDTO);
[OperationContract]
int UpdateOrder(ref OrderDTO orderDTO);
[OperationContract]
IList GetOrderByPerson(int personID);
[OperationContract]
OrderDTO GetOrder(int orderID);
[OperationContract]
int AddPerson(ref OrderDTO orderDTO);
[OperationContract]
int UpdatePerson(ref OrderDTO orderDTO);
[OperationContract]
OrderDTO GetPerson(int personID);
[OperationContract]
IList GetPersonList();
[OperationContract]
OrderDTO Payment(int orderID);
}
public class OperationService:IOperationService
{
[OperationBehavior(TransactionScopeRequired
= true, TransactionAutoComplete = true)]
public int AddOrder(ref OrderDTO orderDTO)
{
OrderService orderService = new OrderService();
Order order = GetOrder(orderDTO);
int n = orderService.AddOrder(order);
orderDTO = OperationAssembler.GetOrderDTO(order,
null);
return n;
}
[OperationBehavior(TransactionScopeRequired
= true, TransactionAutoComplete = true)]
public int DeleteOrder(OrderDTO orderDTO)
{
OrderService orderService = new OrderService();
return orderService.DeleteOrder(GetOrder(orderDTO));
}
[OperationBehavior(TransactionScopeRequired
= true, TransactionAutoComplete = true)]
public int UpdateOrder(ref OrderDTO orderDTO)
{
OrderService orderService = new OrderService();
Order order = GetOrder(orderDTO);
int n = orderService.UpdateOrder(order);
orderDTO = OperationAssembler.GetOrderDTO(order,
null);
return n;
}
..............
..............
}
} |
°Ë¡¢ÏµÍ³×ÜÌå¼Ü¹¹
1. ÌåÏÖÁìÓòÇý¶¯Éè¼ÆµÄ¼Ü¹¹
µ½´Ë×ܽáÒ»ÏÂÁìÓòÇý¶¯Éè¼ÆDDDµÄ×ÜÌå½á¹¹£¬Repository²ãʹÓÃORMÓ³Éä»òSQLÃüÁîµÈ·½Ê½°Ñ³Ö¾Ã»¯Êý¾Ýת»¯ÎªÁìÓò¶ÔÏó£¬È»ºó¸ù¾ÝÒµÎñÂß¼Éè¼Æ¶ÔÓ¦ÁìÓò²ã·þÎñDomain
Service ¡£½Ó×ÅÓ¦ÓÃ²ã½øÐвÙ×÷ÉϵÄе÷£¬ÀûÓÃRepository¡¢ÁìÓòÄ£ÐÍ¡¢ÁìÓò²ã·þÎñDomain
Service Íê³ÉÒµÎñÐèÒª£¬ÔÙͨ¹ýÊý¾Ýת»»Æ÷°ÑÁìÓò¶ÔÏóDomain Objectת»¯ÎªÊý¾Ý´«Êä¶ÔÏóDTO¡£×îºó£¬ÀûÓÃÔ¶³ÌͨѶ¼¼Êõ°ÑÓ¦ÓòãµÄ·þÎñ£¨Application
Service£©¶ÔÍ⿪·Å¡£
×¢ÒâÁôÒâµÄÊÇSOAϵͳÖУ¬UI±íÏÖ²ãÓëApplication ServiceÓ¦Óòã·þÎñÊÇʵÏÖ·ÖÀëµÄ£¬±íÏÖ²ã¿ÉÒÔͬʱµ÷Óö෽µÄÔ¶³Ì·þÎñÀ´Íê³É¹¤×÷¡£

2. ÌåÏÖÃæÏò·þÎñ¿ª·¢µÄ¼Ü¹¹
ÃæÏò·þÎñ¿ª·¢SOAµÄ¼Ü¹¹Ö÷ÒªÌåÏÖÔÚ±íÏÖ²ãÓëÓ¦ÓòãÖ®¼äͨ¹ýÔ¶³ÌͨѶʵÏÖ·ÖÀ룬±íÏÖ²ã¿ÉÒÔÒýÓö෽µÄÓ¦Ó÷þÎñ×÷Ϊ»ù´¡¡£ÓÉ´ËϵͳʵÏÖÒµÎñÉϵķÖÀ룬²»Í¬µÄ¹¦ÄÜÄ£¿é¿ÉÒÔ¶ÀÁ¢¿ª·¢£¬×îºóͨ¹ý·þÎñÔÚ±íÏֲ㹲ͬÌåÏÖ¡£³¤ÆÚµÄ·¢Õ¹£¬Ê¹²»ÉÙµÄÆóÒµÕë¶Ôµ¥¸ö¹¦ÄÜÄ£¿é¿ª·¢³öÒ»Ì×¶ÀÁ¢µÄϵͳ£¬ÔÙͨ¹ýÇ¿´óµÄÐéÄ⻯¼¼ÊõΪµÚÈý·½Ìṩ·þÎñ£¬Õâ¾ÍÊÇÔÆ¼ÆËãµÄǰÉí¡£
¾ÍÏñÒ»¸öͨѶ¹ºÎïµÄƽ̨£¬Æäʵ¾ÍÊÇ×ÛºÏÁËÄÚ²¿ÒµÎñ¹ÜÀí¡¢ÒøÐÐתÕÊ·þÎñ¡¢ºô½ÐÖÐÐÄ¡¢µÚÈý·½½Ó¿ÚµÈ¶à·½·þÎñµÄ×ÛºÏÐÔÆ½Ì¨¡£Èç¹ûÄãÓйýÕâ·½ÃæµÄ¾Ñ飬¾Í»áÖªµÀÆäÊµÒøÐÐתÕÊ¡¢ºô½ÐÖÐÐIJ»¹ý¾ÍÊÇÒøÐС¢µçÐÅ¡¢Òƶ¯µÈ¹«Ë¾ÌṩµÄ¼¸¸ö¼òµ¥µÄ½Ó¿Ú¡£¿ª·¢ÈËÔ±¸ù±¾ÎÞÐèÀí»áÆäʵÄÚ²¿µÄ½á¹¹£¬Ö»ÒªÍ¨¹ý¼¸¸ö¼òµ¥µÄÔ¶³Ì·½·¨¾ÍÄܵ÷Óá£ÕâÕýÊÇÓ¦Óòã·þÎñ
Application Service µÄ×îºÃÌåÏÖ¡£

3. ½áÊøÓï
дÕâÆªÎÄÕÂÄ¿µÄÖ»ÊÇÏëÓë¸÷λ·ÖÏíÒ»ÏÂÎÒÔÚ¿ª·¢¹ý³ÌÖеÄһЩÌå»á£¬»¶Ó¸÷λµãÆÀ£¬Ö¸³öÆäÖеIJ»×ã¡£
Æäʵ¼Ü¹¹ÊÇËÀÎÈ˲ÅÊÇÓÐÄÔ×ÓµÄÉúÎÿһ¸ö¼Ü¹¹±ØÈ»»áÓÐÆäÓŵ㣬Ҳ»áÓв»×ãÖ®´¦£¬ÎÒÃÇÓ¦¸Ã´Ó¿ª·¢Ö®ÖÐÒ»ÆëÆðÀ´ÌåÑ飬¶ø²»ÊÇäĿµØ¸ú´Ó£¬Ï£ÍûÔÚϵÄ×¾¼ûÄܹ»¸ø´ó¼Ò´øÀ´°ïÖú¡£¿É±ðÍüÁËÖ§³Öһϣ¬Í¦Ò»Í¦¡£ |