#¬Ü¼Ð=SD #°Æ¼Ð=Microsoft.NET Design Patterns±MÄæ #¤j¼Ð=Enterprise LibraryºÞ²z¤¶­±ªº¬[ºc»P³]­p #§@ªÌ=¤å¡þªLÄ£¬Ã #¤Þ¨¥=¤§«e§Ú­Ì´¿¸g¤¶²Ð¹L¥Hlog4net¨ÓÀ°§U³nÅé¶}µo¤H­û°lÂܨt²Î¥X¿ùªº­ì¦]¡A³o¦¸±N²`¤J­åªR.NET Enterprise Library³]­p§Þ³N¡A¨ó§UŪªÌ¶}µo·sªºApplication block¡A¦Ó¥B¥i¥H±q¤¤¼ô±xPlug-inªº³]­p§Þ¥©¡C §Ú¦b«e¦¸±MÄ椶²Ð.Net Enterprise Libªº³]­p¬[ºc¡APlug-in¬O¥¦ªº­«­n³]­p·§©À¡A¨ä¤¤ªºConfiguration Application Block(CAB)¬O¾ã­ÓEnterprise Lib¬[ºcªº®Ö¤ß¡ACAB§â¨C­ÓApplication block³£µø¬°¤@­Óplug-in¡A¨Ã¥B´£¨Ñ¤@­Ó¹Ï§Î¤ÆºÞ²z¤¶­±¡AºÙ¬°Configuration Console¡C¦p¹Ï1©Ò¥Ü¡A¶}µo¤H­û¦b³]­p¶¥¬q¨Ï¥ÎConsole³]©wApplication blockªºConfiguration¡A©ó§G¸p«á¡AÀç¹BºÞ²z¤H­û¨Ï¥ÎConsole§ïÅܳ]©w®É¡ACAB·|³qª¾¹B¦æ¤¤ªºApplication Block¡A¥ÑApplication block¦Û¦æ¨M©w¬O§_­n§Y®É±Ä¥Î·sªº³]©w­È¡C¦pªG­n¨Ï¦Û¤v³]­pªºApplication Block³QConfiguration consoleºÞ²z¡A«h¥²¶·¤F¸ÑConfiguration Application Block¹ï³]­p¶¥¬qªº¤ä´©»P­n¨D¡A¦b¦Û­qªºApplication block¤¤´£¨Ñ¥²­nªº¸ê®Æµ²ºc¡A»P¹ê²{Console©Ò»Ý­nªºµ{¦¡¤¶­±¡C¥»¤å±N»¡©úEnterprise LibraryºÞ²z¤¶­±ªº¬[ºc»P³]­p¼Ò«¬¡A¤£¦ý¦³§U©óŪªÌ¶}µo·sªºApplication block¡A¦Ó¥B¥i¥H±q¤¤¼ô±xPlug-inªº³]­p§Þ¥©¡C -------¹Ï-------- ¹Ï1 -------¹Ï-------- #¤¤¼Ð=Enterprise LibraryºÞ²z¤¶­± Configuration Console¤À¬°¤G³¡¤À¡A¤@³¡¤À¬O¤º³¡ªº¸ê®Æ³B²z¡Aµy«á»¡©ú¡A¥t¤@³¡¤À¬OUIªº®i²{¡A§Ú­Ì¥ý±qUI¶}©l¬ã¨s¡CUI¥]§t¤W¤U¥ª¥k¥|­Ó³¡¤À¡A¥ªÃ䪺Tree View®i¥ÜConfigurations dataµ²¾ðª¬ºc¡A®Ú¸`ÂI¬OSolution¡A¨C¤@­Ósolution¥i¥H¥]§t¦h­ÓApplication¡A¨C¤@­ÓApplicationªº³]©w¸ê®Æ©ñ¦b¤@­ÓUIHierarchy¤¤¡C¨C­ÓConfigurations data¥H¤@­ÓTree nodeÅã¥Ü¡A¤º³¡«hºÙ¬°Configuration Node¡A¥kÃä¬OVS.NET¤º«ØªºProperty Grid¡A¥Î¨ÓÅã¥Ü¤Î½s¿è¸`ÂI¸ê®Æ¡C¤U¤è«h¬OValidation Error List¡A¥Î¨ÓÅã¥ÜConfiguration Error¡A¦Û°ÊÀˬdªº¥\¯à¬OGUI¤¶­±¤ñtext editing¦n¥Îªº¦a¤è ! Consoleªº¤W¤è³¡¤À¬O¥\¯àªí¡A¥¦©MTree view¤WªºContext menu¦X°_¨Ó¬OConfiguration ConsoleªºMenu service¤º®e¡A¥¦·|ÀHµÛ¨Ï¥ÎªÌÂI¿ï¤£¦PºØÃþªº¸`ÂI¡A°ÊºA½Õ¾ã¥¿½Tªº¥\¯àªí²M³æ¡A¨¾¤î¨Ï¥ÎªÌ¤£¥¿·íªº¾Þ§@¡C¡]¹Ï2¡^ -------¹Ï-------- ¹Ï2 -------¹Ï-------- #¤¤¼Ð=À³¥ÎDesign Time Supportªº¨BÆJ §Ú­Ì¥ÎHelloWorld Applcation block¬°¨Ò¡A¹Ï3¬OEnterprise Library»PDesign Time Supportªº¬[ºc¹Ï¡AHelloWorld Application block¥]§t¨â­Ó³¡¤À¡A°ò¼h¤¸¥ó¬O¹ê²{HelloWorldªº¸ê®Æ»P¥\¯à¡A¤W¼h¤¸¥ó¹ê²{Design Time Configuration¡C§Ú­Ì¤À¤T­Ó³¡¨BÆJ¤F¸Ñ¨ä³]­pªº¼Ò¦¡»P§Þ³N¡C -------¹Ï-------- ¹Ï3 -------¹Ï-------- #¤¤¼Ð=UIªº³]­p Configuration Console¨Ï¥Î¦bUI¤è­±¥D­n¥Î¨ì¤G­Ó§Þ³N¡A¤@¬O¨Ï¥ÎTreeViewÅã¥Ü¶¥¼h¦¡ªºConfiguration Nodes¡A¤@¬O¨Ï¥ÎPropertyGridÅã¥Ü»P½s¿è¨C­ÓConfiguration nodeªº¸ê®Æ¡C±q¹Ï4ªº¥ªÃä¶}©l¡AConfiguration console¨Ï¥ÎÄ~©Ó¤F.NET WindowsUI TreeViewªºCustomTreeView¡C¤º§tÅã¥Ü¥ÎªºTreeNode¡AºÙ¬°ConfigurationTreeNode¡AConsole¥ÎConfigurationTreeNodeÅã¥Ü¤º§tªºConfiguration Node¸ê®Æ¡A¾ã­ÓTree¥Nªí¤@­ÓSolution¡A¥ÑSolution Configuration Node¥Nªí¡ASolution¥i¥H¥]§t¦h­ÓApplicationsªº°t¸m³]©w¡A¥ÑApplication Configuration Node¥Nªí¡AApplication©Ò¾Ö¦³ªº¸`ÂI§Î¦¨¤@­ÓUIHierarchy¡AConsoleªº¥kÃäµø®ØªºPropertyGridÅã¥ÜUIHierarchy¤º§tªºSelected Node¸ê®Æ¡C CAB Design time support¥HConfigurationNode¬°®Ö¤ß¡AConfigurationNodeÄ~©ÓSitedComponentÃþ§O¡A¹ê²{ISite¤¶­±¡A©Ò¥H·íConfiguration node³Q©ñ¤J©Î²¾¥XTreeView®É¡A¥i¥H³z¹LOnSited()»POnUnSited()¨Æ¥ó³qª¾TreeView°µµe­±ªº³B²z¡C ¦ý¬OConfigurationNode¬O©â¶HÃþ§O¡A¨C­ÓApplication Block¥²¶·´£¨Ñ­Ó§Oªº¨ãÅéÃþ§O¡A¦bHelloWorldªºConfiguration Design®M¥ó¸Ì¡A¨ãÅé¹ê²{¤FHelloWorldSettingsNode-¥NªíApplication blockªº°t¸m¡ATextGreetingProviderNode-¥Nªí´£¨ÑGreeting¥\¯àªº°t¸m¡A¤ÎTextGreetingNode-¥Nªí¹ï¯S©w¤Hªº°Ý­Ô»y³]©w¡C ¨ä¹êÅã¥Ü¦bTreeView»PPropertyGridªºData¨Ó¦Û©óHelloWorld Configuration°ò¦®M¥ó¸ÌªºHelloWorldSettings¡BTextGreetingProviderData¡B¤ÎTextGreetingData¡CHelloWorldSettingsNode¡BTextGreetingProviderNode»PTextGreetingNode¬OÀ³¥ÎWrapper design patternªºWrapperÃþ§O¡A¤À§O¤º§t©Ò»Ý­nªº°t¸mª«¥ó¡A©Ò¦³­Ó§OªºConcrete ConfigurationNode¥²¶·´£¨ÑPropertyGrid©Ò»Ý­nªºÅã¥Ü±±¨î»P½s¿è¥\¯à¡C -------¹Ï-------- ¹Ï4 -------¹Ï-------- #¤¤¼Ð=´£¨ÑPropertyGridªºÅã¥Ü±±¨î»P½s¿è¥\¯à ·íTreeView¤Wªº¸`ÂI³Q¿ï¨ú®É¡AConfiguration ConsoleªºMainForm·|³]©wPropertyGridªº¾Þ§@ª«¥ó¬°³Q¿ï¨úªºConfigurationNode¡A¦pµ{¦¡1ªºµ{¦¡¦Cªí¡C¦b¹w³]ªº±¡ªp¤U¡A SelectedObject¥þ³¡ªºpublic variables»Pproperties³£·|Åã¥Ü¦bGrid¤W¡A©Ò¥H¼Ð·Çªº³]­p­ì«h¬O«Å§i©Ò¦³ªºmember variables¬°private¡A¨Ã¦b¨C­Ópublic property¤W³]©wPropertyGrid¬ÛÃöªºAttributes¡A¥H±±¨îÅã¥Ü»P½s¿è¦æ¬°¡C -----µ{¦¡----- #µ{¦¡1 // In Console MainForm.cs private void OnTreeViewAfterSelect(object sender, TreeViewEventArgs e) { ConfigurationTreeNode node = e.Node as ConfigurationTreeNode; UpdateSelection(node); ¡K } private void UpdateSelection (ConfigurationTreeNode treeNode) { object[] objects = new object[] {treeNode.ConfigurationNode}; propertyGrid.SelectedObjects = objects; } -----µ{¦¡----- §Ú­Ì¥Hµ{¦¡2ªºµ{¦¡¦Cªí¬°¨Ò¡A»¡©ú¦p¦ó¹B¥ÎPropertyGrid Control¡C¨Ï¥Î[Browsable(false)] Attribute«ü©w³o­Ópublic property¤£Åã¥ÜGrid¤¤¡A¨Ï¥Î[ReadOnly] Attribute³]©wProperty¦bGrid¤¤¬O§_¥i¥H­×§ï¡C[DefaultGreetingProvider] Attribute¬OÅý¨Ï¥ÎªÌ¦bHelloWorld Application Block¤¤¿ï¾Ü¹w³]ªºGreetingProvider¡A¨Ï¥Î[Required] Attribute³W©w¦¹Äæ¦ì¤£¯à¬°null¡A[SRCategory]Ä~©Ó.NET¤º«Øªº[Category]Attribute¡AÅýPropertyGird§âpropertyÅã¥Ü¦b«ü©wªº¤ÀÃþ¡C[SRDescription]Ä~©Ó.NET¤º«Øªº[Description]Attribute¡A³]©wPropertyGridÅã¥Ü¦b¤U¤èªºÄæ¦ì»¡©ú¡A[ReferenceType]³W©w¦¹Propertyªº¸ê®Æ«¬ºA¡C -----µ{¦¡----- #µ{¦¡2 // in HelloWorldSettingsNode.cs [ReadOnly(true)] public override string Name { get { return base.Name; } set { base.Name = value; } } [Required] [SRCategory(¡§¡K¡¨)] [SRDescription(¡§¡K¡¨)] [Editor(typeof(ReferenceEditor), ¡K] [ReferenceType(typeof(GreetingProviderNode))] public GreetingProviderNode DefaultGreetingProvider { } -----µ{¦¡----- PropertyGrid½s¿èÄæ¦ì¸ê®Æ®É¡A·|®Ú¾ÚÄæ¦ìªº¸ê®Æ«¬ºA¿ï¾Ü¾A·íªºUITypeEditor¡A¨Ò¦pbool­È¨Ï¥Îtrue/false listbox¡A¦r¦ê©Î¼Æ­È«h¨Ï¥Îtextbox¡C¹J¨ì«È¤á¦Û¦æ©w¸qªº¸ê®Æ«¬ºA¡A«h¥i¥Ñ.NET Design Time Support¦Û¦æ§PÂ_¡A©Î¦pµ{¦¡1¨Ï¥Î[Editor] Attribute«ü©w½s¿è¦¹Äæ¦ì©Ò¥ÎªºEditor¡C¦bCABªºConfiguration Design®M¥ó¤¤¤ä´©ReferenceEditor¡A¥¦ªº¥\¯àÅý¨Ï¥ÎªÌ±q¥Ø«eApplicationªºReference Type instances¤¤¿ï¾Ü©Ò»Ý­nªºObject¡C¨ä¹B§@ªº³W«h¬O·í¨Ï¥ÎªÌ±qPropertyGridÂI¿ï­×§ïÄæ¦ì¤º®e®É¡APropertyGridµo¥XEdit Request¨ì.NET Design Time Support®M¥ó¡A.NET Design time support±q³Q½s¿èªºª«¥ó¨ú¥X«ü©wªºEditor¡A?¥ÎReferenceEditor¡AReferenceEditor§ä¥X²Å¦XReferenceTypeªº¥þ³¡Instances¡A¦A¶}?ReferenceEditorUIªºListbox¦C¥X²M³æ¡AÅý¨Ï¥ÎªÌ¿ï¨ú¡A³Ì«á°µ¤@¨Ç Validation§¹¦¨½s¿è¤u§@¡C -------¹Ï-------- ¹Ï5 -------¹Ï-------- #¤¤¼Ð=´£¨Ñ°ÊºAªº¥\¯àªí»P°Ê§@ªA°È ¤F¸Ñ¦p¦óÅã¥Ü»P½s¿èÄæ¦ì¸ê®Æ«á¡A§Ú­Ì±µ¤U¨Ó±´°QConfiguration Console»PCABªºDesign®M¥ó¦p¦ó¤ä´©¥\¯àªí»P°Ê§@(Actions)¡CConfiguration Console¦³¹w³]ªº¤½¥Î¥\¯àªí¡A¨Ò¦pSave File¡AHelp¡A¨Ï¥ÎªÌÂI¿ïTreeNode®É¡A«h«öNodeºØÃþ¥[¤J¹ïÀ³ªºContext Menu Items¡A¨Ò¦pSolutionNode¥i¥H¦³New Application¥\¯àªí¶µ¥Ø¡AApplicationNode¥i¥H¦³new Application Block¥\¯àªí¶µ¥Ø¡AApplication Blockªº¸`ÂI»P¤º³¡¸`ÂI¡A«h­n«öApplication Blockªº³]­p¨M©w¡A§Ú­Ì¥Ñ¤W¦Ó¤U²`¤J¤F¸Ñ¤º³¡ªº³]­p§Þ³N¡C ¨Ï¥ÎªÌ¦bTreeView¤WÂI¿ïÂI¸`®É¡A¶i¤Jµ{¦¡3ªºOnTreeViewAfterSelect()¤èªk¡A±µµÛ¬O¤Þ¥ÎLoadMenuItemsFromNode()¡A¦A±qNodeªºAddMenuItems()¤èªk¨ú¥X¥i¥H¨Ï¥Îªºmenu items©ñ¤J¥þ°ìªºMenuService¡A¥¦¬O¤@­Ómenu itemsªºContainer¡A³Ì«áCreateContextMenu()±qMenu service¨ú¥XMenu items¡A¨Ã½Æ»s¤@¥÷Á{®ÉªºContext Menu¡A¥ÑWindows UIªº¼Ð·ÇRight mouse click¨Æ¥óÅã¥Ü¥X¨Ó¡C -----µ{¦¡----- #µ{¦¡3 // In Console MainForm.cs private void OnTreeViewAfterSelect(¡K) { LoadMenuItemsFromNode(¡K) CreateContextMenu(); } -----µ{¦¡----- ConfigurationNodeªºAddMenuItems()¥æµ¹OnAddMenuItems()¨ú±oMenu items¡A©Ò¥H¨C­ÓConcrete ConfigurationNode¥²¶·override OnAddMenuItems ()¡AOnAddMenuItems()­t³d«Ø¥ß·sªºMenuItems¡Aµ¹¤©Item¦WºÙ¤Î³]©wMenu ItemªºAction Command¡C¨Ò¦pµ{¦¡4¡A·sSolution¥u¦³¹w³]ªºnew application¥\¯à¡A©Ò¥H¥²¶·override OnAddMenuItems()¡A¨ä¤º®e¬OªÅªºªí¥Ü¨S¦³¦Û©wªº¥\¯àªí¶µ¥Ø¡CApplication¸`ÂI¥i¥HÅçÃÒ°t¸m³]©w¬O§_¥¿½T¡AClose Application¡A¤Î«Ø¥ß·sªºApplication blocksµ¥¥\¯à¡CHierachyLoad()­t³d±q¥Ø¿ý¤¤¸ü¤J¤ä´©Design Time SupportªºApplication blocks¡CHelloWorldSettingsNode¥NªíHelloWorld Application block¡A±q³o­Ó¸`ÂI¥i¥H«Ø¥ßGreetingProvider¡A©Ò¥H¨Ï¥ÎConfigurationNode.CreateDynamicMenuItems()«Ø¥ßnew providerªºmenu items¡C¦bTextGreetingProviderNodeªºOnAddMenuItems()«h¬O´£¨Ñ«Ø¥ßTextGreetingNodeªºmenu item¡CTextGreetingNode¬OTreeView¾ðª¬µ²ºcªºLeaf¸`ÂI¡A¥Ø«e¨S¦³´£¨ÑÃB¥~ªº¥\¯à¡A©Ò¥H¤£»Ý­noverride OnAddMenuItems()¤F¡C -----µ{¦¡----- #µ{¦¡4 // In SolutionConfigurationNode.cs protected override void OnAddMenuItems() { } // In aApplicationConfigurationNode.cs protected override void OnAddMenuItems() { AddMenuItem(¡K.CreateValidateNodeCommand(..)); AddMenuItem(¡KCloseApplicationConfigurationCo mmand); Hierarchy.Load(); } // In HelloWorldSettingsNode.cs protected override void OnAddMenuItems() { base.OnAddMenuItems (); CreateDynamicMenuItems(typeof(GreetingProvider Node)); } // In TextGreetingProviderNode.cs protected override void OnAddMenuItems() { base.OnAddMenuItems (); AddMenuItem(¡K AddChildNodeCommand(typeof(TextGreetingNode)) ¡K); } -----µ{¦¡----- #¤¤¼Ð=Console¡BCAB Design®M¥ó»PApplication Block Design®M¥óªº¬[ºc³]­p ¨C­ÓApplication blockªºDLL©ñ¦bApplicationªº°õ¦æ¥Ø¿ý¤¤¡AApplicationConfigurationNodeªºOnAddMenuItems()¨Ï¥ÎHierarchy.Load()±q¥Ø¿ý¤¤¸ü¤J¤ä´©Design Time SupportªºDLL¡A¦ýApplication¦p¦ó±oª¾DLL¬O§_¤ä´©CABªºDesign time support ? ÃöÁä¦b©ó¨C­ÓApplication BlockªºAssemblyInfo.cs¡A¸Ì­±¥²¶·«Å§i[ConfigurationDesignManager] Attributes¡A¦pµ{¦¡5ªºµ{¦¡¦Cªí¡A¤è¯à³QHierarchy.Load()¸ü¤J¡C -----µ{¦¡----- #µ{¦¡5 [assembly: ConfigurationDesignManager(typeof(HelloWorldConf igurationDesignManager))] -----µ{¦¡----- §Ú­Ì¤w¸g¤F¸Ñ¦p¦ó¸ü¤JApplication Block¡A¥[¤JApplication BlockªºConfigurations¡A¦bTreeViewÅã¥ÜConfiguration Node¡A¤Î¦bPropertyGrid¤¤½s¿èConfiguration Node¡C²{¦b§Ú­Ì±q¹Ï6¨Ó¬ÝConsole¡BCAB Design®M¥ó¡B»PApplication blockªº¬[ºc³]­p¡CConfiguration ConsoleªºMainForm?°Ê®É¡A·|¥ý²£¥Í¤@­ÓConfigurationDesignHostª«¥ó¡A¸Óª«¥ó¬O¤@­Ó¥þ°ìªºServiceContainer¡A¤º§tMeunService¡BUIService¡BNodeCreationServiceµ¥µ¥¡A¥¦¬OConsole»PUIHierarchyªº·¾³q¾ô¼Ù¡C±µ¤U¨Ó¡A¨Ï¥ÎªÌ°õ¦ænew application¥\¯àªí¡AConsole¬°Application«Ø¥ß¤@­ÓUIHierarchyÀx¦s¥þ³¡ªº°t¸m¸ê®Æ¡A¨Ã¨Ï¥ÎUIHierarchy.Load()¤èªk¸ü¤JApplication¥Ø¿ý¤UªºApplication blocks¡A³o®É­ÔConsole¸g¥ÑDesignManagerDomain¸ü¤JAssembly»Pconfiguration File¡ADesignManagerDomain¥D­nªº¥ô°ÈÁÙ¦³Save §ó·sªºConfigurations¡C³Ì«á¤@­Ó³]­p¬O±Ä¥Îproxy design pattern¡A¦]¬°CABªºDesign®M¥óµLªk¨Æ¥ý¨ú±oApplication BlockªºDesignManager(ManagerªºClass Name¬O¦Û©wªº)¡A¬°¤FÅýCAB Design®M¥ó¨ã¦³¿W¥ß§¹¾ãªº¯S©Ê¡A©Ò¥HCAB Design®M¥ó´£¨ÑDesignManagerProxy¡AÅýConsole»PCAB Design®M¥ó³z¹LProxy¤Þ¥ÎApplication BlockªºDesignManager¥\¯à¡C -------¹Ï-------- ¹Ï6 -------¹Ï-------- #¤¤¼Ð=µ²½× Enterprise LibraryªºDesign Time Support»PConfiguration Console¦P®É¤ä´©Runtime»PDesignªº³]©w¡A¥]§t§¹¾ãªºUI³]­p¡A¹B¥Î¤Fplugin»P¦hºØdesign patterns¡A¬O´£ª@.NET§Þ³N»P³nÅé³]­p¥\¤Oªº³Ì¨Î½d¥»¡A­È±oŪªÌ²`¤J¬ã¨s¡C ³d¥ô½s¿è¡þ¶À¶®´f ----------box-------- §@ªÌ²¤¶ ªLÄ£¬Ã ¥xÆW¦a°ÏMicrosoft.NET§Þ³N¥N¨¥¤H¡A²{¥ô¾È¾_¬ì§Þ°ÆÁ`¸g²z¡A¾ú¥ô²Ä¤Tªi¸ê°T§Þ³NÁ`ºÊ¤Î¨|ùּƦì¬ì§ÞÁ`¸g²z¡C±Mªø©ó¸ê°T¨t²Î³W¹º¡BºÞ²z³nÅé¶}µo¹Î¶¤»P³nÅé§Þ³N¡A¾Ö¦³Rational OOAD¡AMicrosoft MCSD/MCSE/MCDBAµ¥»{ÃÒ¸ê®æ¡A¬°Microsoft.NET/Java/³nÅé¤uµ{ªºÁ¿®v»PÅU°Ý¡C ---------end--------------