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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
C# APIÖеÄÄ£ÐͺÍËüÃǵĽӿÚÉè¼Æ
 
  3989  次浏览      27
 2018-6-13
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚinfoq£¬±¾½Ì³ÌÎÒÃǽ«ÌÖÂÛÄ£Ðͱ¾ÉíÒÔ¼°ÏàÓ¦µÄ.NET½Ó¿Ú¡££¬Ï£Íû¶ÔÄúµÄѧϰÓаïÖú¡£

¹Ø¼üÒªµã

1.¿É±äÄ£ÐÍÓ¦¸Ã¾ß±¸×ÔÎÒÑéÖ¤µÄÄÜÁ¦£¬²¢ÊµÏÖÑéÖ¤½Ó¿Ú¡£

2.ÔÚ¹²Ïí¶ÔÏóʱ£¨ÌرðÊÇÔÚ¿çÏ̹߳²Ïíʱ£©£¬¿¼ÂÇʹÓò»¿É±äÄ£ÐÍ¡£

3.¿¼ÂÇÖ§³ÖMVVM·ç¸ñUIµÄµ¥²ãºÍ¶à²ã³·Ïû¡£

4.ÔÚʵÏÖÊôÐÔ±ä¸ü֪ͨʱ±ÜÃâ²»±ØÒªµÄÄÚ´æ·ÖÅä¡£

5.²»Òª¸²¸ÇÄ£Ð͵ÄEqualsºÍGetHashCode·½·¨¡£

ÔÚ´«Í³µÄMVC¡¢MVP¡¢MVVM¡¢Web MVCÕâЩUIģʽÖУ¬Ä£ÐÍÊÇÒ»¸ö¹«¹²ÔªËØ¡£ËäÈ»ÓкܶàÎÄÕÂÌÖÂÛÕâЩ¼Ü¹¹ÖеÄÊÓͼºÍ¿ØÖÆÆ÷£¬µ«¼¸ºõÎÞÒ»Éæ¼°Ä£ÐÍ¡£ÔÚ±¾ÎÄÖУ¬ÎÒÃǽ«ÌÖÂÛÄ£Ðͱ¾ÉíÒÔ¼°ÏàÓ¦µÄ.NET½Ó¿Ú¡£

ÎÒÏëÏȶ¨ÒåһЩÊõÓÕâЩÊõÓïÔÚÆäËûÎÄÕÂÖпÉÄÜÓиü¾«È·µÄ¶¨Ò壬µ«¶ÔÓÚÎÒÃÇÀ´ËµÕâЩÒѾ­×ã¹»ÁË¡£

Êý¾ÝÄ£ÐÍ£¨Data Model£©

Êý¾ÝÄ£ÐÍʱ°üº¬Êý¾Ý£¨¼´ÊôÐԺͼ¯ºÏ£©ºÍÐÐΪµÄ¶ÔÏó»ò¶ÔÏóͼ¡£Êý¾ÝÄ£ÐÍÊDZ¾ÎĵÄÖØµã¡£

Êý¾Ý´«Êä¶ÔÏó£¨Data Transfer Object,DTO£©

DTOÊÇÖ»°üº¬ÊôÐԺͼ¯ºÏµÄ¶ÔÏó»ò¶ÔÏóͼ¡£Ò»¸öÕæÕýµÄDTOûÓÐÈκÎÐÐΪ£¬¶øÇÒ¼¸ºõÊDz»¿É±äµÄ¡£

²»¹ý£¬ÔÚʹÓôúÂëÉú³É¹¤¾ßÉú³ÉDTOʱ£¬Í¨³£»áʹÓÃһЩ¼òµ¥µÄ½Ó¿Ú£¨ÈçINotifyPropertyChanged£©¡£

¶ÔÏóͼ£¨Object Graph£©

Ò»¸ö¶ÔÏóͼÓÉÒ»¸ö¶ÔÏóºÍËùÓпɴ¥¼°µÄ×Ó¶ÔÏó×é³É¡£ÔÚÌÖÂÛÊý¾ÝÄ£ÐͺÍDTOʱ£¬ÎÒÃÇËù˵µÄ¶ÔÏóͼ¶¼Êǵ¥ÏòÊ÷×´½á¹¹£¨Ñ­»·Í¼ÊÇ´æÔڵ쬵«ËüÃÇ»á¶ÔÐòÁл¯¿ò¼ÜÔì³ÉÓ°Ï죩¡£

ÁìÓòÄ£ÐÍ£¨Domain Model£©

ÁìÓòÄ£ÐÍÊÇÃèÊöÒ»×éÏà¹ØÊý¾ÝÄ£Ð͵ĸü¸ß¼¶¸ÅÄî¡£

ʵÌ壨Entity£©

ÊõÓʵÌ塱ÓÐÐí¶à¶¨Ò壬ÆäÖÐһЩÓë¡°Êý¾ÝÄ£ÐÍ¡±»ù±¾Ïàͬ¡£Ëæ×ÅnHibernateºÍEntity FrameworkµÄÁ÷ÐУ¬Õâ¸öÊõÓïÒ»°ãÊÇÖ¸ÓëÊý¾Ý¿â±íÒ»¶ÔÒ»Ó³ÉäµÄDTO¡£

»ùÓÚÕâ¸ö¶¨Ò壬ʵÌå¿ÉÒÔÓÃÊôÐÔÀ´ÐÞÊΣ¬ÒÔ±ã¸ü¾«È·µØÃèÊöÊý¾Ý¿âÁкÍÊôÐÔÖ®¼äµÄÓ³Éä¹ØÏµ¡£Ëü»¹Ö§³Ö´ÓÊý¾Ý¿âÑÓ³Ù¼ÓÔØ×Ó¼¯ºÏ¡£

ËäÈ»¿ÉÒÔͨ¹ýÀ©Õ¹ÈÃʵÌå³Ðµ£Êý¾ÝÄ£Ð͵ĽÇÉ«£¬µ«ÔÚÓ¦ÓÃÒµÎñÂß¼­Ö®Ç°£¬½«ÊµÌåÓ³Éäµ½µ¥¶ÀµÄÊý¾ÝÄ£ÐÍ»òDTOÊǸüΪ³£¼ûµÄ×ö·¨¡£

ÒµÎñʵÌ壨Business Model£©

²»ÒªÓëORMµÄʵÌå»ìÏýÁË£¬ÕâÊÇÊý¾ÝÄ£Ð͵ÄÁíÒ»ÖÖ³ÊÏÖ·½Ê½¡£

²»¿É±ä¶ÔÏó£¨Immutable Object£©

²»¿É±ä¶ÔÏó²»°üº¬¿ÉÒԸıäÊôÐԵķ½·¨£¬Ëü±¾Éí²»ÊÇÊý¾ÝÄ£ÐÍ£¬µ«Ëü¿ÉÄܳöÏÖÔÚ±íʾ¾²Ì¬²éÕÒÊý¾ÝµÄÊý¾ÝÄ£ÐÍÖС£ÒòΪËüÃDz»Äܱ»Ð޸ģ¬ËùÒÔ¿ç¶à¸öÊý¾ÝÄ£Ð͹²ÏíÒ»¸ö²»¿É±ä¶ÔÏóÊǰ²È«µÄ¡£

Êý¾Ý·ÃÎʲ㣨Data Access Layer,DAL£©

ÔÚ±¾ÎÄÖУ¬DAL°üº¬ÁË·þÎñ¶ÔÏó¡¢´æ´¢¿â¡¢Ö±½ÓÊý¾Ý¿âµ÷Óá¢Web·þÎñµ÷Óõȡ£»ù±¾ÉϰüÀ¨ÁËÈκÎÓÃÓÚÓëÍⲿÒÀÀµÏÈçÊý¾Ý´æ´¢£©·¢Éú½»»¥µÄ¶«Î÷¡£

Êý¾ÝÄ£ÐÍÌØÕ÷

ÕæÕýµÄÊý¾ÝÄ£ÐÍÊÇ¿ÉÈ·¶¨ÐÔ²âÊÔ£¨deterministically testable£©µÄ¡£Ò²¾ÍÊÇ˵£¬ËüÃÇÖ»ÓÉÆäËû¿ÉÈ·¶¨ÐÔ²âÊÔµÄÊý¾ÝÀàÐÍ×é³É¡£ÕâÒâζ×ÅÊý¾ÝÄ£ÐÍÔÚÔËÐÐʱ²»ÄÜÓÐÈκÎÍⲿÒÀÀµ¹ØÏµ¡£

×îºóÒ»µãºÜÖØÒª¡£Èç¹ûÒ»¸öÀàÔÚÔËÐÐʱÓëDALñîºÏ£¬ÄÇôËü¾Í²»ÊÇÊý¾ÝÄ£ÐÍ¡£¼´Ê¹ÔÚ±àÒëʱʹÓÃIRepository½Ó¿ÚÀ´¡°½âñÀ࣬ҲÎÞ·¨Ïû³ýÓëÍⲿÒÀÀµµÄ¹ØÏµ¡£

ÔÚÅжÏʲôÊÇÊý¾ÝÄ£ÐÍʱ£¬ÒªÐ¡ÐÄÄÇЩ¡°´æ»îʵÌ塱¡£ÎªÁËÖ§³ÖÑÓ³Ù¼ÓÔØ£¬À´×ÔORMµÄʵÌåͨ³£»á°üº¬Ò»¸ö¶ÔÊý¾Ý¿âÉÏÏÂÎĵÄÒýÓá£Õâ¾ÍÓÖÈÃÎÒÃǻص½ÁË·ÇÈ·¶¨ÐÔÐÐΪµÄÁìÓò£¬ÊµÌåÐÐΪµÄ±ä»¯È¡¾öÓÚÉÏÏÂÎÄ״̬ÒÔ¼°¶ÔÏóµÄ´´½¨·½Ê½¡£

»»¾ä»°Ëµ£¬Êý¾ÝÄ£Ð͵ÄËùÓз½·¨¶¼Ó¦¸ÃÊÇ¿ÉÔ¤²âµÄ£¬¶øÇÒÕâÖÖÔ¤²âÖ»ÄÜ»ùÓÚËüÃǵÄÊôÐÔÖµ¡£

ÔÚ¸¸¶ÔÏóºÍ×Ó¶ÔÏóÖ®¼ä´«µÝÏûÏ¢

¸¸¶ÔÏóºÍ×Ó¶ÔÏóͨ³£ÐèÒª½»»¥¡£Èç¹û×öµÃ²»ºÃ£¬¿ÉÄܻᵼÖÂÄÑÒÔÀí½âµÄ½ôÃܽ»²æñîºÏ¡£ÎªÁ˼ò»¯ÎÊÌ⣬Çë×ñÑ­ÒÔÏÂÈýÌõ¹æÔò£º

1.¸¸¶ÔÏó¿ÉÒÔÖ±½ÓÓë×Ó¶ÔÏóµÄÊôÐԺͷ½·¨½»»¥¡£

2.×Ó¶ÔÏóÖ»ÄÜͨ¹ý´¥·¢Ê¼þÓ븸¶ÔÏó½øÐн»»¥¡£

3.¶ÔÏó²»ÄÜÖ±½ÓÓëÐֵܶÔÏó½»»¥£¬ÐֵܶÔÏóÖ®¼äµÄÏûÏ¢±ØÐëͨ¹ý¹²Í¬µÄ¸¸¶ÔÏóÀ´´«µÝ¡£

»ùÓÚÕâÑùµÄÉè¼Æ£¬¿ÉÒÔ½«×Ó¶ÔÏó·Ö½â³öÀ´£¬²¢ÔÚûÓи¸¶ÔÏóµÄÇé¿öÏÂ¶ÔÆä½øÐвâÊÔ¡£²âÊÔ±¾Éí¿ÉÒÔ¼à¿ØÖ»Óи¸¶ÔÏóÄܹ»´¦ÀíµÄʼþ¡£

ÑéÖ¤¡ª¡ªÊý¾ÝÄ£ÐÍΨһ±ØÐë¾ß±¸µÄ¹¦ÄÜ

½ÓÏÂÀ´ÎÒÏë̸̸Êý¾ÝÄ£ÐÍ¿ÉÄÜ»áʵÏֵĿÉÑ¡ÌØÐÔ¡£µ«ÔÚ¿ªÊ¼Ö®Ç°£¬ÎÒÏëÏÈÌÖÂÛÿ¸öÊý¾ÝÄ£ÐͱØÐë¾ß±¸µÄÒ»¸öÌØÐÔ£ºÑéÖ¤¡£

ÍêÈ«²»´¦ÀíÊý¾ÝµÄÊý¾ÝÄ£Ðͼ¸ºõÊDz»´æÔڵġ£Èç¹ûÄ£ÐÍÊÇÀ´×ÔÎļþ¡¢ÍⲿӦÓóÌÐò»òÓû§½çÃæ£¬¾ÍÓпÉÄÜ»áÒýÈë²»Ò»Ö»ò²»ºÏ·¨µÄÖµ¡£À´×ÔÓû§½çÃæµÄÎÊÌâ»á¸ü¶à£¬ÒòΪÓû§Í¨³£ÐèÒªÖð¸ö×ֶεÃÌîд±íµ¥¡£

ÒòΪ´æÔÚÕâЩÏÞÖÆ£¬ËùÒÔ²»ÄÜÔÚ¹¹Ô캯ÊýºÍÊôÐÔÉèÖÃÆ÷ÖÐʹÓÃÒì³££¬¾ÍÏñÄãÔÚÆäËûÀàÖÐʹÓÃÒì³£Ò»Ñù¡£²»¹ý¿ÉÒÔÑéÖ¤½Ó¿Ú£¬Îª´íÎó¼ì²éÌṩһЩÁé»îÐÔ¡£

.NETÌṩÁËһЩ¿ªÏä¼´ÓõÄÑéÖ¤½Ó¿Ú£¬²»¹ýÿ¸öÈ˶¼ÓÐ×Ô¼ºÌض¨µÄÐèÇó¡£

IDataErrorInfo

IDataErrorInfo½Ó¿ÚÔç¾Í¿ÉÒÔÓÃÁË£¬²»¹ýÏÖÔÚ»ù±¾±»ÆúÓã¬ÒòΪËüÓÃÆðÀ´ºÜÂé·³¡£ÈÃÎÒÃÇÀ´¿´¿´ËüµÄÊôÐÔ¡£

string Error {get;}£ºÕâ¸öÊôÐÔÓÐÈý¸öÓÃ;£º

1.±¨¸æ¶ÔÏó¼¶±ðµÄ´íÎó

2.±¨¸æËùÓÐÊôÐÔ¼¶±ðµÄ´íÎó

3.ͨ¹ý·µ»ØÒ»¸ö¿Õ×Ö·û´®À´±íʾ²»´æÔÚ´íÎó

string this[string columnName ] { get ; }£ºÕâ¸öË÷ÒýÆ÷ÊôÐÔ½«·µ»ØÊôÐÔÌØ¶¨µÄ´íÎó¡£

ÕýÈçÄãËù¿´µ½µÄ£¬ErrorÊôÐÔ×öµÄÊÂÇéÌ«¶àÁË£¬Ëü½«ËùÓж«Î÷¶¼Æ´´Õ³ÉÒ»¸ö×Ö·û´®£¬´Ó¶øÎÞ·¨Çø·Ö¶ÔÏó¼¶±ðºÍÊôÐÔ¼¶±ðµÄÑéÖ¤´íÎó¡£Èç¹ûÄãÖØÐ¶¨ÒåËü£¬ÈÃËüÖ»°üº¬¶ÔÏó¼¶´íÎó£¬ÄÇô¾ÍÎÞ·¨ÖªµÀ¶ÔÏó×÷ΪÕûÌåÊÇ·ñ°üº¬´íÎó¡£

ÖÁÓÚË÷ÒýÆ÷£¬Äã»áÔõôµ÷ÓÃËü£¿Òª·ÃÎÊËüµÄΨһ·½·¨Êǽ«¸Ã¶ÔÏóת»»³ÉIDataErrorInfovariable¡£È»ºó£¬ºÜÉÙÓÐÈË»áÆÚÍû¿´µ½ÕâÑùµÄ´úÂ룺

var nameError = ( ( IDataErrorInfo ) customer )[ "Name" ];

Èç¹ûÄãµÄUI¿ò¼ÜÐèÒªÕâ¸ö½Ó¿Ú£¬ÎÒ½¨ÒéÄ㽫Ëü·Åµ½Ò»¸ö»ùÀàÖУ¬²¢Ìṩ¸üºÏÀíµÄÑéÖ¤API¡£Ò»µ©¼ÓÈëÕæÊµµÄÑéÖ¤Âß¼­£¬ÉõÖÁ¿ÉÒÔºöÂÔ IDataErrorInfo µÄ´æÔÚ¡£

INotifyDataErrorInfoµÄ³£¹æ¶¨Òå

ÎÒ½«·ÖÁ½´ÎÌÖÂÛ INotifyDataErrorInfo½Ó¿Ú¡£ÔÚ±¾Ð¡½ÚÖУ¬ÎÒ½«½âÊͱ¾¸ÃÈçºÎʹÓÃINotifyDataErrorInfo£¬È»ºóÔÚÏÂÒ»¸öС½Ú½âÊÍÎÒÈÏΪӦ¸ÃÈçºÎʹÓÃËü¡£

INotifyDataErrorInfo½Ó¿ÚÖ¼ÔÚÖ§³ÖSilverlight 4ÖеÄÒì²½ÑéÖ¤£¬Æä»ù±¾Ïë·¨ÊÇÐÞ¸ÄÊôÐԻᴥ·¢·þÎñµ÷Ó㬱»µ÷ÓõķþÎñ×îÖÕ»á½áÊø²¢¸üдíÎó״̬¡£

Õâ¸ö½Ó¿ÚµÄΨһÊôÐÔÊÇbool HasErrors {get;}£¬²»¹ý¹ØÓÚÈçºÎʵÏÖÕâ¸öÊôÐÔ²¢Ã»ÓÐÓ²ÐԹ涨¡£ÎÒÃÇÓÐÁ½¸ö»ù±¾Ñ¡Ïµ«¶¼²»¿ÉÐС£

1.×èÈûÖ±µ½Òì²½ÑéÖ¤Íê³É£¬ÕâÑù»á¹ÒÆðUI¡£

2.Á¢¼´·µ»Ø£¬Õâ»áÈõ÷ÓñäµÃ²»È·¶¨£¬ÒòΪÄã²»ÖªµÀÊÇ·ñ´æÔÚ¹ÒÆðµÄÒì²½ÑéÖ¤ÇëÇó¡£

Èç¹ûÖ»ÊǽøÐÐÒ»°ãµÄÏÔʾ£¬Ö»ÒªÔÚ·¢Éú EventHandler < DataErrorsChangedEventArgs > ErrorsChangedʼþʱ¸üÐÂHasErrorsÊôÐÔ¼´¿É¡£²»¹ý£¬Èç¹ûÄã³¢ÊÔµ¥»÷¡°±£´æ¡±°´Å¥Í¬²½¼ì²éÑé֤״̬£¬ÄÇÕâ¾Í²»ÊÇÒ»¸öºÃ°ì·¨¡£

´ËÍ⣬ErrorsChangedÀíÂÛÉÏ¿ÉÒÔ´¥·¢Á½´Î£ºÒ»´ÎÊÇÁ¢¼´´¥·¢£¬ÁíÒ»´ÎÊÇÒì²½ÑéÖ¤Íê³Éºó´¥·¢¡£Õâ¿ÉÄÜ»á²úÉúÆæ¹ÖµÄUIЧ¹û£¬ÒòΪHasErrors»áÔÚÁ½ÖÖ״̬֮¼äÇл»¡£

×îºóÊÇIEnumerable GetErrors(string propertyName)·½·¨£¬Õâ¸ö·½·¨ÓÃÓÚÑéÖ¤ÊôÐÔ¡£²»¹ý£¬ÄãÒ²¿ÉÒÔ´«¸øËüÒ»¸önull»ò¿Õ×Ö·û´®À´»ñÈ¡¶ÔÏó¼¶ÑéÖ¤´íÎó¡£

Ëü·µ»ØµÄÊÇIEnumerable¶ø²»ÊÇIEnumerable<ValidationResult>£¬ÕâÈÃËü¿´ÆðÀ´¾ÍÏñÊÇÒ»¸öC# 1µÄ½Ó¿Ú£¬¶ø²»ÊÇ·ºÐÍ¡£

²»¹ýȱ·¦ÀàÐͰ²È«²¢²»ÊÇΨһµÄÎÊÌ⣬Õâ¶Î»°Õª×ÔËüµÄÎĵµ£º

´Ë·½·¨·µ»ØÒ»¸öIEnumerable£¬ÔÚÒì²½ÑéÖ¤Íê³É´¦Àí֮ǰ£¬¿ÉÄܻᷢÉú±ä»¯¡£°ó¶¨ÒýÇæÒò´ËÄܹ»ÔÚÌí¼Ó¡¢É¾³ý»òÐ޸ĴíÎóʱ×Ô¶¯¸üÐÂÓû§½çÃæÑéÖ¤·´À¡¡£

Èç¹ûÕâ¸ö·½·¨·µ»ØÒ»¸öIObservable£¬»òÐí¾ÍûÓÐÎÊÌâ¡£µ«ÊÇÔÚÕâÖÖÇé¿öÏ£¬IEnumerableÄܹ»×àЧµÄΨһ·½·¨ÊÇÈÃËüÔڵȴýÒì²½ÑéÖ¤Íê³É֮ǰ×èÈû¡£ÕâÑùÈÔÈ»»áµ¼ÖÂUI¹ÒÆð¡£

È»ºóÊÇ·â×°ÎÊÌâ¡£ÈçǰËùÊö£¬Êý¾ÝÄ£ÐÍÓ¦¸ÃÍêȫûÓÐÈκÎÍⲿÒÀÀµ¡£ÊôÐԱ仯²»Ó¦Ö±½Óµ÷Ó÷þÎñ£¬ÒòΪÕâ»áʹ¸ÃÀà±äµÃ·Ç³£ÄÑÒÔ²âÊÔ¡£Èç¹ûÄãÐèÒªÒì²½Ñé֤ijЩÄÚÈÝ£¬ÇëÔÚ¿ØÖÆÆ÷»òÊÓͼģÐÍÖÐÖ´Ðд˲Ù×÷¡£

INotifyDataErrorInfoµÄÕýÈ·Ó÷¨

¾¡¹Ü´æÔÚȱÏÝ£¬µ«INotifyDataErrorInfoÒѾ­±»ÓÃÔںܶàUI¿ò¼ÜÖУ¬ËùÒÔÎÒÃÇÎÞ·¨ºöÂÔËü¡£ËùÐÒµÄÊÇ£¬ÎÒÃÇ¿ÉÒÔÔÚ²»ÆÆ»µ¼æÈÝÐÔµÄÇé¿öÏÂÖØÐ¶¨ÒåËü¡£

HasErrorsÊôÐÔ¿ÉÒÔÔÚÆäËûÊôÐÔ·¢Éú±ä»¯Ê±½øÐÐͬ²½¸üС£Èç¹ûÒ»¸öÀàʵÏÖÁËINotifyPropertyChanged£¬²¢ÇÒÖµ·¢Éú±ä»¯£¬¾Í»á´¥·¢PropertyChangedʼþ¡£

²»¹ÜÖ¸¶¨µÄÊôÐÔÊÇÓÐЧ»¹ÊÇÎÞЧ£¬¶¼Ó¦¸Ã´¥·¢ErrorsChangedʼþ¡£Èç¹û¶ÔÏó¼¶ÑéÖ¤ÒѾ­·¢Éú±ä»¯£¬ÔòӦʹÓÃnull»ò×Ö·û´®´¥·¢ErrorsChangedʼþ¡£

ÔÚÐÂÄ£ÐÍÖУ¬GetErrorsÓ¦¸ÃʼÖÕ·µ»ØÒ»¸öÖ§³ÖIEnumerable<ValidationResult>µÄ¼¯ºÏÀà¡£ValidationResultÀàÌṩÁËÓÐÓõÄÐÅÏ¢£¬ÀýÈçÄÄЩÊôÐÔÊÇÑéÖ¤¾¯¸æµÄÒ»²¿·Ö¡£Õâ¶ÔÓÚһЩ´íÎóÏûÏ¢À´Ëµ·Ç³£¹ÜÓ㬱ÈÈç¡°ÖÁÉÙÐèÒªÌṩÃû×Ö/ÐÕÊÏÖеÄÒ»¸ö¡±¡£

»ùÓÚÊôÐÔµÄÑéÖ¤

ÎÒÃÇ¿ÉÒÔʹÓûùÓÚÊôÐÔµÄÑéÖ¤Íê³ÉºÜ¶à¹¤×÷£¬ËäÈ»ÕâÑù²¢²»ÊʺÏËùÓеÄÇé¿ö¡£·½·¨ÊÇÔÚÊôÐÔÉÏ·ÅÖÃValidationAttributeµÄ×ÓÀà¡£ÕâÀïÓÐЩÀý×Ó£º

1.CreditCardAttribute

2.EmailAddressAttribute

3.EnumDataTypeAttribute

4.FileExtensionsAttribute

5.PhoneAttribute

6.UrlAttribute

7.MaxLengthAttribute

8.MinLengthAttribute

9.RangeAttribute

10.RegularExpressionAttribute

11.RequiredAttribute

12.StringLengthAttribute

Òª´´½¨×Ô¼ºµÄÑéÖ¤ÊôÐÔÀֻ࣬ÐèÖØÐ´IsValid·½·¨¡£Í¨³£ÕâÓÃÓÚµ¥ÊôÐÔÑéÖ¤£¬²»¹ýÒ²¿ÉÒÔͨ¹ýValidationContextÀ´·ÃÎʶÔÏóµÄÆäËûÊôÐÔ¡£

»ùÓÚÊôÐÔµÄÑéÖ¤µÄÒ»¸öÓŵãÊÇ£¬Ò»Ð©¿ò¼Ü£¨±ÈÈçASP.NET MVC/WebAPI£©ÒѾ­Ñ¡¶¨Ëü×÷ΪÑéÖ¤½Ó¿Ú¡£ÒòΪËüÊÇÉùÃ÷ʽµÄ£¬ËùÒÔ¿ÉÒÔÓëUI¹²ÏíÑéÖ¤Âß¼­¡£

»ìºÏÃüÁîʽºÍ»ùÓÚÊôÐÔµÄÑéÖ¤

ËäÈ»ÀíÂÛÉÏ¿ÉÒÔʹÓÃÑéÖ¤ÊôÐÔÀ´Íê³ÉËùÓй¤×÷£¬µ«ÓÐʱºòʹÓÃÆÕͨ´úÂë¿ÉÒÔ¸üÈÝÒ×µØÊµÏÖÑϸñµÄÑéÖ¤¡£ÕâÑù×öµÄÔ­ÒòÈçÏ£º

1.ÑéÖ¤¹æÔòÉæ¼°¶à¸öÊôÐÔ

2.ÑéÖ¤¹æÔòÉæ¼°×Ó¶ÔÏó

3.ÑéÖ¤¹æÔò²»»á±»ÆäËûÀà»òÊôÐÔÖØÓÃ

ÃüÁîʽÑéÖ¤µÄÒ»¸öȱµãÊÇËüÖ»´æÔÚÓÚ·þÎñÆ÷¶Ë£¬ÎÞ·¨ÏñʹÓûùÓÚÊôÐÔµÄÑéÖ¤Ò»Ñù×Ô¶¯ÓëUI¹²ÏíÑéÖ¤Âß¼­¡£

ÃüÁîʽÑéÖ¤µÄÁíÒ»¸öÏÞÖÆÊÇËüÐèҪʹÓù²Ïí½Ó¿Ú£¬ÕâÑù²ÅÄÜÈÃÓ¦ÓóÌÐòµÄÆäÓಿ·Öͨ¹ýÒ»Öµķ½Ê½´¥·¢ÑéÖ¤¡£

¿Õ±íµ¥ÎÊÌâ

µ±Óû§ÔÚ´´½¨Ð¼Ç¼²¢Î´ÌîдËùÓбØÌî×Ö¶Îʱ£¬¾Í»á³öÏÖ¿Õ±íµ¥ÎÊÌâ¡£ÔÚÏÔʾ±íµ¥Ê±£¬Ä㲻ϣÍû¿´µ½Ã¿¸ö×ֶζ¼ÒÔºìɫͻ³öÏÔʾ¡£

ΪÁ˽â¾öÕâ¸öÎÊÌ⣬ÐèҪΪģÐÍÌṩÁ½¸ö¶îÍâµÄ·½·¨£º

ÑéÖ¤£º¿çËùÓÐ×Ö¶ÎÖ´ÐÐÑéÖ¤£¬´¥·¢ÀàËÆ¡°required¡±ÕâÑùµÄ¹æÔò¡£

Çå³ý´íÎ󣺴ӶÔÏóÖÐɾ³ýËùÓÐÒÑ´¥·¢µÄÑéÖ¤´íÎó¡£

¶ÔÓÚÕâÖÖÄ£ÐÍ£¬Ä£ÐͶÔÏ󽫴ӳõʼ״̬¿ªÊ¼¡£Èç¹ûËüÔÚÏÔʾ¸øÓû§Ö®Ç°ÒѾ­°üº¬Á˲¿·ÖÖµ£¬ÔòÓ¦¸ÃÔÚÏòÓû§ÏÔʾ֮ǰµ÷ÓÃÇå³ý´íÎóµÄ·½·¨¡£

µ±Óû§ÐÞ¸Äij¸ö×Ö¶Îʱ£¬Ö»ÑéÖ¤¸Ã×ֶΡ£È»ºó£¬ÔÚ±£´æÖ®Ç°£¬¿ÉÒÔµ÷ÓÃÑéÖ¤·½·¨Ç¿ÖƶÔÄ£ÐͽøÐÐÈ«Ãæ¼ì²é£¬°üÀ¨·ÇÓû§Ð޸ĵÄÊôÐÔ¡£

ÀíÂÛÉϵÄÑéÖ¤½Ó¿Ú

ÎÒÈÏΪ.NETµÄÑéÖ¤½Ó¿ÚÓ¦¸Ã¿´ÆðÀ´ÏñÕâÑù£º

public interface IValidatable
{

/// This forces the object to be completely revalidated.
bool Validate();

/// Clears the error collections and the HasErrors property
void ClearErrors();

/// Returns True if there are any errors.
bool HasErrors { get; }

/// Returns a collection of object-level errors.
ReadOnlyCollection<ValidationResult> GetErrors();

/// Returns a collection of property-level errors.
ReadOnlyCollection<ValidationResult> GetErrors(string propertyName);

/// Returns a collection of all errors (object and property level).
ReadOnlyCollection<ValidationResult> GetAllErrors();

/// Raised when the errors collection has changed.
event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
}

Äã¿ÉÒÔÔÚTortuga Anchor¿âÖп´µ½Õâ¸ö½Ó¿ÚµÄʵÏÖ¡£

IValidatableObject

Èç¹û²»¼òÒªÌÖÂÛÏÂIValidatableObject½Ó¿Ú£¬ÄǾÍÊÇÎÒµÄʧְ¡£Õâ¸ö½Ó¿ÚÖ»ÓÐÒ»¸ö·½·¨IEnumerable<ValidationResult> Validate(ValidationContext validationContext)¡£

ÎÒºÜϲ»¶Õâ¸ö·½·¨£¬ÒòΪËü¿ÉÒÔ´¥·¢¶ÔÏóµÄÍêÕûÑéÖ¤£¬ËùÒÔËü¿ÉÒÔ½â¾ö¿Õ±íµ¥ÎÊÌâ¡£Ëü·µ»ØValidationResult¶ÔÏ󣬱Èԭʼ×Ö·û´®ÒªºÃµÃ¶à¡£

ȱµãÊÇËü½ÓÊÜValidationContext¶ÔÏó×÷Ϊ²ÎÊý£¬¶ø¼¸ºõûÓÐÈËÖªµÀÈçºÎʹÓÃÕâ¸öÀà¡£ÒÔÏÂÊÇValidationContextµÄÊôÐÔ¡£

1.DisplayName£º»ñÈ¡»òÉèÖÃÒªÑéÖ¤³ÉÔ±µÄÃû³Æ¡£

2.Items£º»ñÈ¡Óë´ËÉÏÏÂÎĹØÁªµÄ¼üÖµ¶Ô×ֵ䡣

3.MemberName£º»ñÈ¡»òÉèÖÃÒªÑéÖ¤³ÉÔ±µÄÃû³Æ¡£

4.ObjectInstance£º»ñȡҪÑéÖ¤µÄ¶ÔÏó¡£

5.ObjectType£º»ñȡҪÑéÖ¤µÄ¶ÔÏóÀàÐÍ¡£

6.ServiceContainer£º»ñÈ¡ÑéÖ¤·þÎñÈÝÆ÷¡£

¹ØÓÚÈçºÎʹÓÃÕâЩÊôÐÔ²¢Ã»ÓÐÏà¹ØµÄÖ¸ÄÏ¡£ÀýÈ磬ʲôʱºòÓ¦¸ÃÉèÖÃMemberNameÊôÐÔ£¿ DisplayNameÊôÐÔʵ¼ÊÉÏ×öÁËʲô£¿×ÖµäÖÐÓ¦¸Ã±£´æÊ²Ã´ÒÔ¼°ÔÚÑéÖ¤ÆÚ¼äºÎʱ¿ÉÒÔ·ÃÎÊËü£¿

ÎĵµÖÐ˵Ëü¡°¿ÉÒÔͨ¹ýÈκÎʵÏÖIServiceProvider½Ó¿ÚµÄ·þÎñÌí¼Ó×Ô¶¨ÒåÑéÖ¤¡±£¬µ«²¢Ã»ÓÐ˵Ã÷IServiceProvider.GetService(Type)·½·¨ÐèÒªÖ§³ÖÄÄЩÀàÐÍ£¬Òò´ËÎÞ·¨ÀûÓôËÌØÐÔ¡£

×ܶøÑÔÖ®£¬ValidationContextÀàÏëÒª×öËùÓеÄÊÂÇ飬µ«ÓÉÓÚÔã¸âµÄAPIÉè¼ÆºÍ¼¸ºõûÓÐÏ꾡µÄÎĵµ£¬Ëü±äµÃÒ»ÎÞÊÇ´¦¡£ÓÉÓÚûÓÐUI¿ò¼ÜʹÓÃÕâ¸ö½Ó¿Ú£¬ËùÒÔûÓÐÀíÓÉÖ§³ÖËü»òIValidatableObject½Ó¿Ú¡£

ÊôÐÔ±ä¸ü֪ͨ

ÊôÐÔ±ä¸ü֪ͨÔںܶàÇé¿ö϶¼ºÜÓÐÓ㬲»¹ý¸ü³£¼ûµÄÊÇÓëMVVMÉè¼ÆÄ£Ê½Ïà¹ØÁª¡£ÊôÐÔ±ä¸ü֪ͨͨ¹ýINotifyPropertyChanged½Ó¿Ú¹«¿ª³öÀ´£¬ÈÃÄ£ÐÍ¿ÉÒÔ֪ͨ¹ØÁªµÄUIÔªËØ£º»ù´¡Êý¾Ý·¢ÉúÁ˱仯¡£ÎÒÃÇ¿ÉÒÔ½è´Ë×öһЩÓÐȤµÄÊÂÇ飬±ÈÈçÔÚºǫ́½ø³ÌÖиüÐÂÄ£ÐÍ»òÕßÔÚ¶à¸öÊÓͼ֮¼ä¹²ÏíÄ£ÐÍ¡£

ʵÏÖÊôÐÔ±ä¸ü֪ͨ×î¼òµ¥µÄ°ì·¨ÊÇÿ´ÎÔÚµ÷ÓÃÊôÐÔÉèÖÃÆ÷ʱ´¥·¢ËüÃÇ¡£ËäÈ»´Ó¼¼Êõ·½Ãæ¿´ÊÇ¿ÉÐе쬵«ÈÔÓÐһЩÐÔÄÜ·½ÃæµÄÓ°Ïì¡£

public string Name
{
get { return m_Name; }
set
{
m_Name = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Name)));
}
}

ÔÚÉÏÃæµÄʾÀýÖУ¬¼´Ê¹Ã»Óв»´æÔÚÈκÎÕìÌýÕߣ¬Ã¿¸öÊôÐÔ±ä¸ü֪ͨÈÃÈ»»á·ÖÅäÒ»¸öжÔÏóÀ´±£´æÊôÐÔÃû³Æ¡£Èç¹ûÕâЩ֪ͨƵ·±·¢Éú£¬Ôò¿ÉÄܻᴥ·¢²»±ØÒªµÄÀ¬»ø»ØÊÕ¡£ÎªÁ˱ÜÃâÕâÖÖÇé¿ö£¬Ó¦¸Ã°ÑPropertyChangedEventArgs¶ÔÏ󻺴æÆðÀ´¡£

ÁíÒ»¸öÎÊÌâÊÇʼþ¿ÉÄÜÊDz»±ØÒªµÄ¡£Èç¹ûÊôÐÔֵʵ¼ÊÉÏûÓз¢Éú¸Ä±ä£¬¾ÍÏ൱ÓÚÎÞÔµÎ޹ʵش¥·¢ÆÁĻ֨»æ¡£ËùÒÔÎÒÃÇÐèÒª×öÒ»¸ö¼òµ¥µÄ¼ì²é£º

static readonly PropertyChangedEventArgs NameProperty = new PropertyChangedEventArgs(nameof(Name));

public string Name
{
get { return m_Name; }
set
{
if (m_Name == value)
return;

m_Name = value;
PropertyChanged?.Invoke(this, NameProperty);
}
}

Õâ¸ö¹ý³Ì¿ÉÄܷdz£·±Ëö£¬Òò´Ë¾ÍÓÐÁË¡°MVVM¿ò¼Ü¡±£¬ÓÃÀ´¼õÉÙÕâЩÔëÒô¡£GetºÍSet·½·¨ÓëÄÚ²¿×ÖµäÒ»ÆðʹÓã¬ÓÃÀ´Î¬»¤×´Ì¬¡£Í¨¹ýÕâÖÖ·½Ê½£¬¿ÉÒÔΪÎÒÃÇ´¦ÀíPropertyChangedEventArgs»º´æºÍÊôÐÔÖµ±ä¸ü¸Ä¼ì²é¡£¾ßÌåϸ½Ú»áÓÐËù²»Í¬£¬µ«ËüÃÇ»ò¶à»òÉÙ¿´ÆðÀ´ÏñÕâ¸öÀ´×ÔTortuga AnchorµÄÀý×Ó¡£

public string Name
{
get => Get<string>();
set => Set(value);
}

Çë×¢Ò⣬ÕâÖÖ±ãÀûÐÔ¿ÉÄÜ»á¶ÔÐÔÄÜÔì³ÉÒ»µãÓ°Ïì¡£·ÃÎÊÄÚ²¿×Öµä±ÈʹÓÃ×Ö¶ÎÂý£¬²¢ÇÒÖµµÄ×°Ïä²Ù×÷¿ÉÄÜ»áÏû³ý»º´æPropertyChangedEventArgsËù´øÀ´µÄÊÕÒæ¡£

Èç¹ûÄãÖ»±àд·þÎñÆ÷¶Ë´úÂ룬¿ÉÄÜ»áÏë¡°ÎÒûÓÐUI£¬ËùÒÔÎÒ²»ÐèÒªÕâЩ¡±¡£Èç¹ûÕæÊÇÕâÑù£¬»òÐíÄãÊǶԵġ£µ«ÓÐʱºòʹÓÃINotifyPropertyChanged¿ÉÒÔ¼ò»¯Ò»Ð©¸´ÔӵĴúÂë¡£ÎÒ½¨Òé·þÎñÆ÷¶Ë¿ª·¢ÈËÔ±ÖÁÉÙ½«ÆäÊÓΪһÖÖÑ¡Ôñ¡£

INotifyPropertyChanging

Õâ¸öÊÇINotifyPropertyChangedµÄÂÏÉúÐֵܣ¬»áÔÚÊôÐÔÖµ·¢Éú±ä¸ü֮ǰ´¥·¢¡£ÆäÄ¿µÄÊÇÈÃÏû·ÑÕß»º´æÏÈǰµÄÖµ¡£LINQºÍEntity FrameworkµÈORM¿ò¼Ü¿ÉÄÜ»áÀûÓÃÕâЩÐÅÏ¢½øÐиú×Ù¡£

ISupportInitialize / ISupportInitializeNotification

ISupportInitializeµÄÄ¿µÄÊÇÁÙʱ½ûÓÃÊôÐÔ/¼¯ºÏ±ä¸ü֪ͨ¡¢´íÎóÑéÖ¤µÈ¡£ÒªÊ¹ÓÃËü£¬ÇëÔÚ½øÐÐÊôÐÔ±ä¸ü֮ǰÏȵ÷ÓÃBeginInit¡£

µ±µ÷ÓÃEndInitʱ£¬¿ÉÒÔ·¢ËÍÒ»¸ö¡°everything changed¡±±ä¸ü֪ͨ¡£Õâ¸öÊÇͨ¹ýʹÓÃÒ»¸ö°üº¬null»ò¿ÕÊôÐÔÃû³ÆµÄPropertyChangedEventArgs¶ÔÏóÀ´Íê³ÉµÄ¡£

Èç¹ûÏ£ÍûÔÚ³õʼ»¯Íê³ÉʱÊÕµ½Í¨Öª£¬¿ÉÒÔ¸ø ISupportInitializeNotification ½Ó¿ÚÌí¼ÓInitializedʼþºÍIsInitializedÊôÐÔ¡£

¼¯ºÏ±ä¸ü֪ͨ

ÕýÈçÎÒÃÇÐèÒªÖªµÀµ¥¸öÊôÐԵıä¸üÒ»Ñù£¬ÎÒÃÇÒ²ÐèÒªÖªµÀÕû¸ö¼¯ºÏ·¢ÉúµÄ±ä¸ü¡£ÎÒÃÇ¿ÉÒÔʹÓÃINotifyCollectionChanged½Ó¿ÚÀ´½â¾öÕâ¸öÎÊÌâ¡£

¿ÉϧµÄÊÇ£¬INotifyCollectionChangedÔ¶²»ÈçËüµÄÃû×ÖËù°µÊ¾µÄÄÇôǿ´ó¡£´ÓÀíÂÛÉϽ²£¬CollectionChangedÏà¹ØÊ¼þ¿ÉÒÔʹÓõ¥¸öʼþÀ´¸æËßÎÒÃǺÎʱÒѽ«Õû×é¶ÔÏóÌí¼Óµ½¼¯ºÏÖлò´Ó¼¯ºÏÖÐɾ³ý¡£µ«Êµ¼ÊÉÏ£¬ÒòΪWPFÖдæÔÚµÄÉè¼ÆÈ±Ïݵ¼ÖÂÎÞ·¨ÊµÏÖÕâÑùµÄ¹¦ÄÜ¡£

INotifyCollectionChanged×îÖøÃûµÄʵÏÖÊÇObservableCollection<T>¡£Õâ¸öÀàÖ¼ÔÚΪÿ¸öÌí¼Ó»òɾ³ýµÄÏîÄ¿´¥·¢Ò»¸öµ¥¶ÀµÄCollectionChangedʼþ¡£ÔÚÉè¼ÆWPFʱ£¬Ëü¼ÙÉèÎÒÃÇ×ÜÊÇ»áʹÓÃObservableCollection<T>£¬Òò´ËWPF²»Ö§³Ö NotifyCollectionChangedEventArgs.NewItems ¾ßÓжà¸öÏîÄ¿µÄÇé¿ö¡£

ÓÉÓÚÕâ¸ö´íÎó£¬Ã»ÓÐÈË¿ÉÒÔʵÏÖ´øÓÐÅúÁ¿¸üÐÂÖ§³ÖµÄINotifyCollectionChanged£¬³ý·ÇËûÃÇ100£¥È·¶¨¼¯ºÏÀ಻»á±»ÓÃÔÚWPFÖС£

Òò´Ë£¬ÎҵĽ¨ÒéÊDz»ÒªÊÔͼ´ÓÍ·¿ªÊ¼´´½¨×Ô¶¨Ò弯ºÏÀà¡£Ö»ÐèʹÓÃObservableCollection<T>»òReadOnlyObservableCollection<T>×÷Ϊ»ùÀ࣬ȻºóÔÚÆäÉÏÌí¼ÓËùÐèµÄÈκθ½¼ÓÌØÐÔ¡£

ÀàÐͰ²È«µÄ¼¯ºÏ±ä¸üʼþ

³ýÁËûÓÐÈËʹÓõŦÄÜÖ®Í⣬INotifyCollectionChanged½Ó¿ÚµÄÁíÒ»¸öÎÊÌâÊÇ£¬Ëü²»ÊÇÀàÐͰ²È«µÄ¡£Èç¹ûÀàÐͶÔÄãÀ´Ëµ·Ç³£ÖØÒª£¬Ôò±ØÐëÖ´ÐУ¨ÀíÂÛÉÏ£©²»°²È«µÄת»»»ò±àд´úÂëÀ´´¦ÀíÓÀÔ¶²»»á·¢ÉúµÄÇé¿ö¡£ÎªÁ˽â¾öÕâ¸öÎÊÌ⣬ÎÒ½¨ÒéʵÏÖÕâ¸ö½Ó¿Ú£º

/// <summary>
/// This is a type-safe version of INotifyCollectionChanged
/// </summary>
/// <typeparam name="T"></typeparam>
public interface INotifyCollectionChanged<T>
{
/// <summary>
/// This type safe event fires after an item is added to the collection no matter how it is added.
/// </summary>
/// <remarks>Triggered by InsertItem and SetItem</remarks>
event EventHandler<ItemEventArgs<T>> ItemAdded;


/// <summary>
/// This type safe event fires after an item is removed from the collection no matter how it is removed.
/// </summary>
/// <remarks>Triggered by SetItem, RemoveItem, and ClearItems</remarks>
event EventHandler<ItemEventArgs<T>> ItemRemoved;
}

Õâ²»½ö½â¾öÁËÀàÐͰ²È«ÎÊÌ⣬¶øÇÒ²»ÐèÒª¼ì²éNotifyCollectionChangedEventArgs.NewItemsµÄ´óС¡£

¼¯ºÏÖеÄÊôÐÔ±ä¸ü֪ͨ

.NETÖÐÁíÒ»¸ö¡°È±Ê§µÄ½Ó¿Ú¡±ÊÇÄܹ»¼ì²â¼¯ºÏÖÐij¸öÏîÄ¿ÊôÐÔºÎʱ·¢Éú±ä»¯¡£±È·½Ëµ£¬ÄãÓÐÒ»¸öOrderCollectionÀ࣬²¢ÇÒÐèÒªÔÚÆÁÄ»ÉÏÏÔʾTotalPriceÊôÐÔ¡£ÎªÁ˱£³ÖÕâ¸öÊôÐÔµÄ׼ȷÐÔ£¬ÄãÐèÒªÖªµÀÿ¸öÏîÄ¿µÄµ¥¼ÛºÎʱ·¢Éú±ä»¯¡£

¶ÔÓÚÎÒ×Ô¼ºµÄ¼¯ºÏ£¬ÎÒ¾­³£»á¹«¿ªÒ»¸öINotifyItemPropertyChanged½Ó¿Ú£¬ÓÃÓÚ½«¼¯ºÏÖжÔÏóµÄÈÎÒâPropertyChangedʼþת³Éµ¥¸öItemPropertyChangedʼþ¡£

Ϊ´Ë£¬¼¯ºÏÐèÒªÔÚ½«¶ÔÏóÌí¼Óµ½¼¯ºÏ»ò´Ó¼¯ºÏÖÐÒÆ³ýʱ¸½¼ÓºÍÒÆ³ýʼþ´¦Àí³ÌÐò¡£

±ä¸ü¸ú×ٺͳ·Ïû

ËäȻʹÓò»ÊÇºÜÆµ·±£¬.NET»¹ÊÇÌṩÁËרÃÅÓÃÓÚ¸ú×Ù¶ÔÏó±ä¸üµÄ½Ó¿Ú£¬ÕâЩ½Ó¿ÚÉõÖÁ»¹ÌṩÁ˳·Ïû¹¦ÄÜ¡£

±ä¸ü¸ú×Ù

´Ó±íÃæÉÏ¿´£¬IChangeTracking½Ó¿Ú¿´ÆðÀ´ºÃÏñºÜÈÝÒ×Àí½â£º¶ÔÏó·¢Éú±ä»¯»òÕßûÓз¢Éú±ä»¯¡£µ«Êµ¼ÊÉÏËüÓеã΢Ãî¡£

´ÓÓû§½çÃæ½Ç¶ÈÀ´¿´£¬Óû§Í¨³£ÏëÖªµÀµÄÊÇ¡°Õâ¸ö¶ÔÏó»òËüµÄÈκÎ×Ó¶ÔÏóÊÇ·ñ·¢Éú±ä»¯ÁË£¿¡±

´ÓÊý¾Ý´æ´¢½Ç¶ÈÀ´¿´£¬ÄãÏ£ÍûÖªµÀ¶ÔÏó±¾ÉíÊÇ·ñ·¢ÉúÁ˱仯¡£

ÎĵµÀïûÓÐÌáµ½ÕâЩ£¬ÒòΪËüûÓж¨ÒåÒ»¸ö×Ó¶ÔÏóÊÇ·ñ±»ÈÏΪÊÇ¡°¶ÔÏóÄÚÈÝ¡±µÄÒ»²¿·Ö¡£ÎÒ¸öÈËÆ«ºÃÈÃIsChanged°üº¬×Ó¶ÔÏóµÄ±ä»¯£¬²¢ÎªÊý¾Ý´æ´¢Ìí¼Óµ¥¶ÀµÄIsChangedLocalÊôÐÔ¡£

¿É»Ö¸´±ä¸ü¸ú×Ù

IRevertableChangeTrackingÌí¼ÓÁËÒ»¸öRejectChanges·½·¨À´³·ÏûÈÎºÎ¹ÒÆðµÄ¸ü¸Ä¡£ÕâÀï´æÔÚͬÑùµÄÎÊÌ⣬¼´Õâ¸ö·½·¨ÊÊÓÃÓÚ±¾µØ¶ÔÏó»¹ÊÇ×Ó¶ÔÏó¡£

ÎÒͨ³£¼ÙÉèRejectChanges»á±éÀú¶ÔÏóͼ£¬²¢¾Ü¾øËùÓÐ¹ÒÆðµÄ±ä¸ü¡£µ«ÔÚÉæ¼°¼¯ºÏÊôÐÔʱ£¬Õâ¿ÉÄÜÓеãõèõΣ¬×îºÃÊǽ«Æä·â×°ÔÚÀàÖУ¬¶ø²»Êdz¢ÊÔ¹¹½¨ÁÙʱ½â¾ö·½°¸¡£

¿É±à¼­µÄ¶ÔÏó

ÓëIChangeTracking²»Í¬£¬IEditableObjectרÃÅÓÃÓÚUI³¡¾°ÖС£¾ßÌåµØËµ£¬¾ÍÊÇÓÃÔÚÌṩȷ¶¨/È¡ÏûÓïÒåµÄ¶Ô»°¿òºÍÊý¾ÝÍø¸ñÖС£

ÔÚÏÔʾ¶Ô»°¿ò»ò½«Êý¾ÝÍø¸ñÇл»µ½±à¼­Ä£Ê½Ö®Ç°£¬±ØÐëµ÷ÓÃBeginEditÀ´²¶×½¶ÔÏóµÄ¿ìÕÕ¡£EndEditÇå³ý¿ìÕÕ£¬¶øCancelEdit½«¶ÔÏó»Ö¸´µ½Ö®Ç°µÄ״̬¡£Çë×¢Ò⣬´ó¶àÊýÊý¾ÝÍø¸ñ»á×Ô¶¯ÎªÄãµ÷ÓÃÕâЩ·½·¨¡£

Èç¹ûÄãͬʱʹÓÃÁËIEditableObjectºÍIRevertableChangeTracking£¬ÄÇôÎÒ½¨Ò齫ÆäʵÏÖΪÁ½¼¶³·Ïû£¬²¢ÈÃIEditableObject´¦ÓÚµÚ¶þ¼¶¡£»òÕß»»¾ä»°Ëµ£¬ÔÚµ÷ÓÃRejectChangeʱͬʱµ÷ÓÃCancelEdit£¬µ«²»ÄÜ·´¹ýÀ´¡£

ÒÅʧµÄÊôÐÔ±ä¸ü½Ó¿Ú

ÔÚORM¼¯³ÉÖм«ÓпÉÄÜȱʧһЩ½Ó¿Ú¡£ÎÒÃÇ¿ÉÒÔʹÓÃIChangeTrackingÀ´¸æËßORMÊÇ·ñÐèÒª±£´æ¸ø¶¨µÄ¼Ç¼£¬µ«²¢Ã»ÓнӿڸæËßÎÒÃÇÄÄЩÊôÐÔÒѾ­·¢Éú¸Ä±ä¡£ÕâÒâζ×ÅORMÐèÒªµ¥¶À¸ú×Ù·¢Éú±ä¸üµÄ×ֶΣ¬»òÕß¼ÙÉèËùÓÐÄÚÈݶ¼·¢Éú±ä»¯£¬²¢½«Õû¸ö¶ÔÏóÖØÐ±£´æµ½Êý¾Ý¿â¡£

Equals¡¢GetHashCodeºÍIEquatable

ÕâÊÇÎÒ½¨Òé±ÜÃâµÄһϵÁÐÌØÐÔ¡£¸ù¾ÝÎÒÃǵ͍Ò壬Êý¾ÝÄ£ÐÍÊǿɱäµÄ¡£Èç¹ûËüÃÇÊDz»¿É±äµÄ£¬ÄÇôÉÏÊöµÄ½Ó¿Ú¶¼Ã»ÓÐÈκÎÒâÒå¡£

ÎÊÌâÊÇÄã²»ÄÜʹÓÿɱäÊôÐÔÀ´°²È«µØÊµÏÖGetHashCodeºÍEquals¡£×Öµä»á¼ÙÉèÉ¢ÁÐÂëÓÀÔ¶²»»á¸Ä±ä£¬ËùÒÔÈç¹ûÒ»¸ö¶ÔÏó±»µ±×÷×ÖµäµÄ¼ü£¬¾Í»áÆÆ»µ×ÖµäµÄ¹¦ÄÜ¡£

´ËÍ⣬¶ÔÓÚÊý¾ÝÄ£ÐÍÀ´Ëµ£¬Equality¾¿¾¹Òâζ×Åʲô£¿ËüÃÇ´ú±íÊý¾Ý¿â±íÖеÄͬһÐУ¨¼´Ö÷¼ü£©£¿»òÕßÁ½¸ö¶ÔÏóµÄÿ¸öÊôÐÔ¶¼Ïàͬ£¿²»¹ÜÄãÈçºÎ»Ø´ðÕâ¸öÎÊÌ⣬ÄãµÄÍŶÓÖÐµÄÆäËûÈ˱ض¨»áÓв»Í¬µÄ´ð°¸¡£

Èç¹ûÄã¾õµÃ±ØÐëÒªÓзÇĬÈϵÄEquals»òGetHashCodeʵÏÖ£¬Ç뿼ÂÇ´´½¨Ò»¸öIEqualityComparer<T>¡£Ëü²»ÊôÓÚÊý¾ÝÄ£ÐÍ£¬ËùÒÔÆäËûÈË¿ÉÒÔÀí½âÄãµÄ×ö·¨ÊǷDZê×¼µÄÐÐΪ¡£

ͬÑù£¬Äã¿ÉÄÜÏ£ÍûΪÅÅÐòÌṩһ¸ö»ò¶à¸öComparer<T>Àà¡£

ICloneable

ÖÚËùÖÜÖª£¬ÎÒÃDz»Ó¦¸ÃʵÏÖICloneable½Ó¿Ú£¬ÒòΪÎÒÃÇ´ÓÀ´¶¼²»ÖªµÀÒ»¸ö¶ÔÏó¿Ë¡ÊÇÉ±´»¹ÊÇdz¿½±´¡£

µ±È»£¬Õâ²¢²»Òâζ×ÅÄã¾ø¶Ô²»Ó¦¸ÃÌṩ¿Ë¡·½·¨¡£Èç¹ûÄãÑ¡ÔñÌṩ¿Ë¡·½·¨£¬¾ÍÓ¦¸Ã·Ç³£Çå³þµØÁ˽ⱻ¿Ë¡µÄÄÚÈÝ¡£»òÕß¿ÉÒÔ½«Æä³ÆÎªShallowClone»òDeepClone¡£

×ܽáÐÔ˼¿¼

Ä£ÐÍÊǹ¹½¨ºÍÀí½âÓ¦ÓóÌÐòµÄ»ù´¡¡£Ä㻨ÔÚÃÖ²¹È±¿ÚÉϵÄʱ¼ä£¬±ÈÈç²»Ò»ÖµÄÃüÃûÔ¼¶¨¡¢È±ÉÙµÄÌØÐԺͲ»ÕýȷʵÏֵĽӿڣ¬×îÖÕ¶¼»á»ñµÃ»Ø±¨¡£

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

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
 
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
 
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì