±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ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¡£
×ܽáÐÔ˼¿¼
Ä£ÐÍÊǹ¹½¨ºÍÀí½âÓ¦ÓóÌÐòµÄ»ù´¡¡£Ä㻨ÔÚÃÖ²¹È±¿ÚÉϵÄʱ¼ä£¬±ÈÈç²»Ò»ÖµÄÃüÃûÔ¼¶¨¡¢È±ÉÙµÄÌØÐԺͲ»ÕýȷʵÏֵĽӿڣ¬×îÖÕ¶¼»á»ñµÃ»Ø±¨¡£ |