ÓÑÇéÌáʾ£ºÈç¹û±¾ÍøÒ³´ò¿ªÌ«Âý»òÏÔʾ²»ÍêÕû£¬Çë³¢ÊÔÊó±êÓÒ¼ü¡°Ë¢Ð¡±±¾ÍøÒ³£¡ÔĶÁ¹ý³Ì·¢ÏÖÈκδíÎóÇë¸æËßÎÒÃÇ£¬Ð»Ð»£¡£¡ ±¨¸æ´íÎó
Ò»ÊÀÊé³Ç ·µ»Ø±¾ÊéĿ¼ ÎÒµÄÊé¼Ü ÎÒµÄÊéÇ© TXTÈ«±¾ÏÂÔØ ½øÈëÊé°É ¼ÓÈëÊéÇ©

VB2008´ÓÈëÃŵ½¾«Í¨(PDF¸ñʽӢÎÄ°æ)-µÚ116ÕÂ

°´¼üÅÌÉÏ·½Ïò¼ü ¡û »ò ¡ú ¿É¿ìËÙÉÏÏ·­Ò³£¬°´¼üÅÌÉ쵀 Enter ¼ü¿É»Øµ½±¾ÊéĿ¼ҳ£¬°´¼üÅÌÉÏ·½Ïò¼ü ¡ü ¿É»Øµ½±¾Ò³¶¥²¿£¡
¡ª¡ª¡ª¡ªÎ´ÔĶÁÍꣿ¼ÓÈëÊéÇ©ÒѱãÏ´μÌÐøÔĶÁ£¡




¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡catch£»¡¡the¡¡assembly¡¡can¡¡be¡¡loaded¡¡dynamically¡¡only¡¡if¡¡Implementations1¡£dll¡¡exists¡¡in¡¡the¡¡local¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡directory¡¡or¡¡the¡¡GAC¡£¡¡As¡¡an¡¡alternative£»¡¡you¡¡could¡¡specify¡¡the¡¡entire¡¡path¡¡in¡¡the¡¡definition¡¡of¡¡the¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡assembly¡£¡¡The¡¡downside¡¡to¡¡this¡¡strategy¡¡is¡¡that¡¡your¡¡assembly¡¡must¡¡always¡¡be¡¡located¡¡at¡¡the¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡same¡¡place¡¡on¡¡different¡¡machines¡£¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡When¡¡the¡¡code¡¡assigns¡¡the¡¡variable¡¡assemblyName£»¡¡it¡¡is¡¡to¡¡a¡¡reference¡¡of¡¡a¡¡loaded¡¡¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡assembly¡£¡¡The¡¡assembly¡¡will¡¡be¡¡parsed£»¡¡and¡¡from¡¡there£»¡¡it¡¡is¡¡possible¡¡to¡¡instantiate¡¡a¡¡type¡£¡¡The¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡second¡¡bolded¡¡line¡¡calls¡¡the¡¡method¡¡CreateInstance£¨£©£»¡¡with¡¡the¡¡name¡¡of¡¡the¡¡type¡¡that¡¡you¡¡want¡¡to¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡instantiate£»¡¡including¡¡the¡¡namespace¡£¡¡So£»¡¡for¡¡example£»¡¡if¡¡Implementations1¡£dll¡¡has¡¡been¡¡loaded£»¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡you¡¡could¡¡instantiate¡¡the¡¡type¡¡¡¡Implementations1¡£Implementation¡£¡¡The¡¡instantiation¡¡will¡¡work¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡even¡¡though¡¡Implementations1¡£Implementation¡¡is¡¡a¡¡private¡¡class£»¡¡because¡¡you¡¡are¡¡using¡¡dynamic¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡programming¡¡principles¡£¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡However£»¡¡being¡¡able¡¡to¡¡instantiate¡¡the¡¡type¡¡does¡¡not¡¡imply¡¡being¡¡able¡¡to¡¡use¡¡the¡¡type¡£¡¡To¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡be¡¡able¡¡to¡¡use¡¡the¡¡instantiated¡¡type£»¡¡you¡¡need¡¡to¡¡be¡¡able¡¡to¡¡cast¡¡to¡¡a¡¡type¡¡that¡¡has¡¡been¡¡declared¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡publicly¡£¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡We¡¡will¡¡continue¡¡the¡¡¡¡Implementations1¡£Implementation¡¡example¡¡and¡¡figure¡¡out¡¡how¡¡to¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡instantiate¡¡and¡¡manipulate¡¡the¡¡instantiated¡¡object¡£¡¡But¡¡before¡¡we¡¡get¡¡to¡¡that¡¡code£»¡¡we¡¡need¡¡to¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡talk¡¡about¡¡an¡¡additional¡¡programming¡¡feature£º¡¡singletons¡£¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Using¡¡Singletons¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡The¡¡class¡¡ConfigurationManager¡¡is¡¡a¡¡shared¡¡class¡¡in¡¡¡¡terms£»¡¡which¡¡means¡¡that¡¡you¡¡cannot¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡instantiate¡¡the¡¡class¡£¡¡In¡¡Visual¡¡Basic¡­speak£»¡¡a¡¡shared¡¡class¡¡is¡¡a¡¡module£»¡¡and¡¡a¡¡shared¡¡method¡¡is¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡a¡¡method¡¡marked¡¡Shared¡£¡¡A¡¡module£»¡¡shared¡¡methods£»¡¡and¡¡shared¡¡data¡¡members¡¡result¡¡in¡¡a¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡single¡­instance¡¡class¡£¡¡Another¡¡way¡¡to¡¡get¡¡the¡¡same¡¡effect¡¡is¡¡to¡¡create¡¡a¡¡singleton¡£¡¡A¡¡singleton¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡behaves¡¡like¡¡a¡¡shared¡¡class£»¡¡except¡¡that¡¡the¡¡class¡¡is¡¡instantiated¡£¡¡An¡¡advantage¡¡of¡¡using¡¡the¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡singleton¡¡approach¡¡is¡¡that¡¡you¡¡can¡¡have¡¡multiple¡¡singletons¡¡of¡¡the¡¡same¡¡type£»¡¡whereas¡¡with¡¡the¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡shared¡¡class£»¡¡there¡¡can¡¡be¡¡only¡¡a¡¡single¡¡shared¡¡class¡£¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Consider¡¡that¡¡locks¡¡have¡¡keys£»¡¡and¡¡sometimes¡¡a¡¡lock¡¡has¡¡a¡¡single¡¡key¡£¡¡Think¡¡of¡¡the¡¡single¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡key¡¡as¡¡a¡¡shared¡¡class¡£¡¡If¡¡that¡¡key¡¡is¡¡to¡¡open¡¡a¡¡vault£»¡¡you¡¡will¡¡most¡¡likely¡¡want¡¡only¡¡one¡¡person¡¡to¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡have¡¡a¡¡key¡£¡¡But¡¡what¡¡if¡¡the¡¡key¡¡is¡¡to¡¡your¡¡house¡¡door£¿¡¡You¡¡would¡¡probably¡¡want¡¡multiple¡¡copies£»¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡but¡¡you¡¡will¡¡want¡¡to¡¡control¡¡who¡¡has¡¡those¡¡keys¡£¡¡So£»¡¡maybe¡¡you¡¡will¡¡have¡¡a¡¡single¡¡house¡¡key£»¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡or¡¡maybe¡¡you¡¡will¡¡have¡¡multiple¡¡house¡¡keys£»¡¡but¡¡you¡¡will¡¡always¡¡be¡¡in¡¡control¡£¡¡The¡¡house¡¡key¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡example¡¡is¡¡analogous¡¡to¡¡the¡¡use¡¡of¡¡a¡¡singleton¡£¡¡You¡¡could¡¡argue¡¡that¡¡a¡¡singleton¡¡could¡¡just¡¡as¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡well¡¡be¡¡used¡¡to¡¡open¡¡a¡¡vault£»¡¡since¡¡you¡¡can¡¡create¡¡a¡¡single¡¡key¡£¡¡But¡¡the¡¡problem¡¡with¡¡a¡¡singleton¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡is¡¡that¡¡using¡¡properly¡¡written¡¡source¡¡code£»¡¡you¡¡could¡¡instantiate¡¡a¡¡second¡¡or¡¡third¡¡instance¡¡of¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡the¡¡singleton¡£¡¡If¡¡you¡¡use¡¡a¡¡shared¡¡class£»¡¡then¡¡source¡¡code¡¡cannot¡¡instantiate¡¡a¡¡second¡¡instance£»¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡thus¡¡enforcing¡¡a¡¡certain¡¡programming¡¡style¡£¡¡


¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­Page¡¡347¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡CH¡¡AP¡¡T¡¡E¡¡R¡¡¡¡¡¡1¡¡2¡¡¡¡¡¡¡ö¡¡¡¡¡¡¡¡L¡¡E¡¡AR¡¡N¡¡IN¡¡G¡¡¡¡¡¡AB¡¡O¡¡U¡¡T¡¡¡¡¡¡AP¡¡P¡¡L¡¡I¡¡CAT¡¡I¡¡ON¡¡¡¡¡¡CO¡¡N¡¡F¡¡IG¡¡U¡¡R¡¡AT¡¡IO¡¡N¡¡¡¡¡¡A¡¡N¡¡D¡¡¡¡¡¡D¡¡Y¡¡N¡¡A¡¡M¡¡IC¡¡¡¡¡¡L¡¡O¡¡AD¡¡IN¡¡G¡¡325¡¡



¡¡¡¡¡¡¡¡¡¡Let¡¯s¡¡define¡¡the¡¡class¡¡ConfigurationLoader¡¡as¡¡a¡¡singleton£»¡¡which¡¡implies¡¡two¡¡things£º¡¡



¡¡¡¡¡¡¡¡¡¡o¡¡¡¡The¡¡creation¡¡of¡¡a¡¡property¡¡called¡¡Instance¡¡that¡¡references¡¡a¡¡single¡¡instance¡¡of¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ConfigurationLoader¡£¡¡



¡¡¡¡¡¡¡¡¡¡o¡¡¡¡The¡¡constructor¡¡of¡¡ConfigurationLoader¡¡as¡¡private£»¡¡implying¡¡that¡¡only¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ConfigurationLoader¡¡can¡¡instantiate¡¡an¡¡instance¡¡of¡¡ConfigurationLoader¡£¡¡This¡¡ensures¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡that¡¡ConfigurationLoader¡¡has¡¡similar¡¡behavior¡¡to¡¡a¡¡shared¡¡class¡¡in¡¡that¡¡the¡¡consumer¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡cannot¡¡instantiate¡¡an¡¡instance¡¡of¡¡the¡¡type¡£¡¡



¡¡¡¡¡¡¡¡¡¡The¡¡following¡¡is¡¡the¡¡singleton¡¡code¡¡for¡¡ConfigurationLoader¡¡£¨placed¡¡in¡¡the¡¡Definitions¡¡¡¡

assembly£©¡£¡¡



Public¡¡Class¡¡ConfigurationLoader¡¡

¡¡¡¡¡¡¡¡Public¡¡Shared¡¡ReadOnly¡¡Property¡¡Instance£¨£©¡¡As¡¡ConfigurationLoader¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Get¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Return¡¡ConfigurationLoader¡£_instance¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Get¡¡

¡¡¡¡¡¡¡¡End¡¡Property¡¡



¡¡¡¡¡¡¡¡Private¡¡Sub¡¡New£¨£©¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡_availableTypes¡¡=¡¡New¡¡Dictionary£¨Of¡¡String£»¡¡ConfigurationInfo£©£¨£©¡¡

¡¡¡¡¡¡¡¡End¡¡Sub¡¡



¡¡¡¡¡¡¡¡Private¡¡Shared¡¡_instance¡¡As¡¡ConfigurationLoader¡¡



¡¡¡¡¡¡¡¡Shared¡¡Sub¡¡New£¨£©¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡_instance¡¡=¡¡New¡¡ConfigurationLoader£¨£©¡¡

¡¡¡¡¡¡¡¡End¡¡Sub¡¡



¡¡¡¡¡¡¡¡¡£¡¡¡£¡¡¡£¡¡



¡¡¡¡¡¡¡¡¡¡The¡¡singleton¡¡property¡¡¡¡Instance¡¡is¡¡declared¡¡as¡¡Shared£»¡¡allowing¡¡a¡¡reference¡¡of¡¡¡¡

ConfigurationLoader¡£Instance¡£¡¡The¡¡implementation¡¡of¡¡the¡¡shared¡¡property¡¡must¡¡reference¡¡a¡¡¡¡

shared¡¡data¡¡member£»¡¡which¡¡is¡¡the¡¡data¡¡member¡¡_instance¡¡in¡¡this¡¡example¡£¡¡The¡¡data¡¡member¡¡¡¡

_instance¡¡is¡¡instantiated¡¡by¡¡the¡¡shared¡¡constructor¡¡Shared¡¡New£¨£©¡£¡¡The¡¡instance¡¡constructor¡¡will¡¡¡¡

instantiate¡¡the¡¡Dictionary¡¡_availableTypes¡£¡¡¡¡



¡öNote¡¡¡¡The¡¡shared¡¡constructor¡¡is¡¡called¡¡before¡¡the¡¡instance¡¡constructor¡¡and¡¡therefore¡¡before¡¡any¡¡client¡¡code¡¡¡¡

has¡¡a¡¡chance¡¡to¡¡access¡¡members¡¡of¡¡the¡¡class¡£¡¡



Using¡¡the¡¡Instantiated¡¡Type¡¡



Now¡¡that¡¡we¡¯ve¡¡covered¡¡the¡¡singleton¡¡aspect£»¡¡we¡¡need¡¡to¡¡get¡¡back¡¡to¡¡the¡¡original¡¡problem¡¡of¡¡¡¡

writing¡¡the¡¡code¡¡to¡¡instantiate¡¡a¡¡type¡¡dynamically¡£¡¡The¡¡following¡¡code¡¡is¡¡used¡¡to¡¡instantiate¡¡¡¡

Impl1¡¡in¡¡the¡¡Main£¨£©¡¡method¡¡of¡¡CallRuntimeImplementation¡¯s¡¡principal¡¡module¡£¡¡


¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­Page¡¡348¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­

326¡¡¡¡¡¡¡¡¡¡¡¡¡¡CH¡¡AP¡¡T¡¡E¡¡R¡¡¡¡¡¡1¡¡2¡¡¡¡¡¡¡ö¡¡¡¡¡¡¡¡L¡¡E¡¡A¡¡R¡¡N¡¡I¡¡N¡¡G¡¡¡¡¡¡A¡¡B¡¡OU¡¡T¡¡¡¡¡¡A¡¡PP¡¡L¡¡I¡¡CA¡¡TI¡¡O¡¡N¡¡¡¡¡¡CO¡¡N¡¡F¡¡I¡¡G¡¡U¡¡R¡¡AT¡¡IO¡¡N¡¡¡¡¡¡AN¡¡D¡¡¡¡¡¡D¡¡Y¡¡N¡¡A¡¡M¡¡I¡¡C¡¡¡¡L¡¡O¡¡AD¡¡I¡¡N¡¡G¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ConfigurationLoader¡£Instance¡£Load£¨£©¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Dim¡¡definition¡¡as¡¡IDefinition¡¡=¡¡_¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ConfigurationLoader¡£Instance¡£Instantiate£¨Of¡¡IDefinition£©£¨¡¨Impl1¡¨£©¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Console¡£WriteLine£¨definition¡£TranslateWord£¨¡¨hello¡¨£©£©¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡öNote¡¡¡¡You¡¡might¡¡get¡¡errors¡¡running¡¡the¡¡code¡£¡¡If¡¡you¡¡do£»¡¡it¡¡is¡¡because¡¡the¡¡assemblies¡¡are¡¡not¡¡in¡¡the¡¡same¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡path¡¡and¡¡the¡¡dynamic¡¡loading¡¡methods¡¡cannot¡¡find¡¡the¡¡assemblies¡£¡¡Solve¡¡this¡¡by¡¡copying¡¡all¡¡of¡¡the¡¡assemblies¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡into¡¡a¡¡single¡¡directory¡¡and¡¡running¡¡the¡¡code¡£¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡The¡¡first¡¡line¡¡is¡¡used¡¡to¡¡retrieve¡¡the¡¡assembly¡¡and¡¡type¡¡information¡¡from¡¡the¡¡configuration¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡file¡£¡¡The¡¡second¡¡line¡¡is¡¡used¡¡to¡¡instantiate¡¡Impl1¡¡and¡¡then¡¡cast¡¡¡¡Implementations1¡£¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Implementation¡¡to¡¡type¡¡IDefinition¡£¡¡The¡¡cast¡¡will¡¡work¡¡because¡¡the¡¡IDefinition¡¡interface¡¡has¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡been¡¡implemented¡¡by¡¡Implementations1¡£Implementation¡£¡¡The¡¡assigned¡¡variable¡¡definition¡¡will¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡reference¡¡a¡¡valid¡¡object¡¡instance¡¡that¡¡implements¡¡IDefinition¡¡and¡¡the¡¡method¡¡TranslateWord£¨£©¡£¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡At¡¡this¡¡point£»¡¡we¡¡need¡¡to¡¡step¡¡back¡¡and¡¡reflect¡¡on¡¡what¡¡has¡¡occurred¡£¡¡We¡¡have¡¡defined¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡within¡¡a¡¡configuration¡¡file¡¡the¡¡location¡¡of¡¡a¡¡type¡£¡¡Some¡¡source¡¡code¡¡in¡¡the¡¡application¡¡read¡¡the¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡configuration¡¡file¡¡at¡¡runtime¡¡and¡¡stored¡¡the¡¡available¡¡types¡£¡¡The¡¡calling¡¡code¡¡knew¡¡about¡¡only¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡the¡¡abstract¡¡type¡¡made¡¡available¡¡under¡¡the¡¡label¡¡Impl1¡¡and¡¡knew¡¡it¡¡implemented¡¡the¡¡interface¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡IDefinition¡£¡¡Then£»¡¡using¡¡some¡¡¡¡magic¡¡involving¡¡dynamic¡¡techniques£»¡¡the¡¡type¡¯s¡¡assembly¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡is¡¡loaded¡¡and¡¡instantiated¡£¡¡This¡¡process¡¡is¡¡unique¡¡because¡¡an¡¡administrator¡¡has¡¡the¡¡ability¡¡to¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡update¡¡where¡¡and¡¡what¡¡type¡¡should¡¡be¡¡instantiated¡¡and¡¡called£»¡¡without¡¡needing¡¡to¡¡repile¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡or¡¡update¡¡the¡¡infrastructure¡£¡¡That¡¡flexibility¡¡makes¡¡it¡¡much¡¡simpler¡¡for¡¡you¡¡to¡¡update¡¡function

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ality¡¡without¡¡having¡¡to¡¡update¡¡the¡¡caller¡¡of¡¡the¡¡functionality¡£¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡öNote¡¡¡¡The¡¡ability¡¡to¡¡dynamically¡¡update¡¡the¡¡functionality¡¡is¡¡of¡¡benefit¡¡to¡¡the¡¡administrator¡¡of¡¡the¡¡application¡£¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡There¡¡is¡¡minimal¡¡benefit¡¡to¡¡the¡¡developer£»¡¡because¡¡the¡¡developer¡¡has¡¡already¡¡converted¡¡the¡¡arc
·µ»ØĿ¼ ÉÏÒ»Ò³ ÏÂÒ»Ò³ »Øµ½¶¥²¿ ÔÞ£¨0£© ²È£¨1£©
δÔĶÁÍꣿ¼ÓÈëÊéÇ©ÒѱãÏ´μÌÐøÔĶÁ£¡
ÎÂÜ°Ìáʾ£º ο´Ð¡ËµµÄͬʱ·¢±íÆÀÂÛ£¬Ëµ³ö×Ô¼ºµÄ¿´·¨ºÍÆäËüС»ï°éÃÇ·ÖÏíÒ²²»´íŶ£¡·¢±íÊéÆÀ»¹¿ÉÒÔ»ñµÃ»ý·ÖºÍ¾­Ñé½±Àø£¬ÈÏÕæдԭ´´ÊéÆÀ ±»²ÉÄÉΪ¾«ÆÀ¿ÉÒÔ»ñµÃ´óÁ¿½ð±Ò¡¢»ý·ÖºÍ¾­Ñé½±ÀøŶ£¡