




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
Prism學(xué)習(xí)(3)---實現(xiàn)可插拔的模塊上一章中,我使用Unity重構(gòu)了解決方案。不過在Application工程中仍然需要引用其他各個依懶項。很明顯,這樣做并不能實現(xiàn)計算器模塊的可插拔。今天,將以此為目標(biāo),對該解決方案進(jìn)行再次的重構(gòu)。首先,在使用Prism框架加載的程序集中分別添加一個類,并讓這些類實現(xiàn)IModule接口。當(dāng)Prism框架加載某個程序集后,將首先在程序集中搜索實現(xiàn)了該接口的類。之后將會調(diào)用該接口的Initialize方法。于是,我們可以在這個方法中實現(xiàn)程序集內(nèi)部的初化始操作,或者執(zhí)行某個動作。通過這種機(jī)制,可以實現(xiàn)程序集的完全解藕。具體的操作如下:1.在CalculatorLibrary程序集中添加一個類:CalculatorModule,并讓其實現(xiàn)IModule接口。代碼如下:2publicclassCalculatorModule:IModule3{4publicCalculatorModule(IUnityContainercontainer)5{6this.container=container;7}8voidIModule.Initialize()9{10container.RegisterType<ICalculator,Calculator>();11container.RegisterType<ICalculatorReplLoop,CalculatorReplLoop>();12}1314IUnityContainercontainer;15}2.在InputOutputLibrary程序集中添加一個類:InputOutputModule,并讓其實現(xiàn)IModule接口。代碼如下:2publicclassInputOutputModule:IModule3{4publicInputOutputModule(IUnityContainercontainer)5{6this.container=container;7}8voidIModule.Initialize()9{10container.RegisterType<IInputService,ConsoleInputService>();11container.RegisterType<IOutputService,ConsoleOutputService>("OutputService1");12container.RegisterType<IOutputService,MsgBoxOutputService>("OutputService2");13}1415IUnityContainercontainer;16}3.在CommandParserLibrary程序集中添加一個類:InputOutputModule,并讓其實現(xiàn)IModule接口。代碼如下:2publicclassInputParsingModule:IModule3{4publicInputParsingModule(IUnityContainercontainer)5{6this.container=container;7}8voidIModule.Initialize()9{10container.RegisterType<IInputParserService,InputParserService>();11}1213IUnityContainercontainer;14}4.在解決方案中新建一個類庫:MainModuleLibrary,在其中添加一個類:MainModule,并實現(xiàn)IModule接口。這個類庫將會作為計算器模塊的入口,在該類的Initialize方法中將會啟動計算器。代碼如下:2publicclassMainModule:IModule3{4publicMainModule(IServiceLocatorserviceLocator)5{6this.serviceLocator=serviceLocator;7}8voidIModule.Initialize()9{10ICalculatorReplLooploop=11serviceLocator.GetInstance<ICalculatorReplLoop>();1213loop.Run();14}1516IServiceLocatorserviceLocator;17}到此,程序集部分的代碼全部完成??梢钥吹剑叭齻€程序集中Module類,使用Initialize方法將各個類注冊到了Container對象中,由Prism框架進(jìn)行管理。我們可以在需要的時候,在任何地方通過Prism框架將其取得調(diào)用;第四個程序集作為計算器的入口,在Module類的Initialize方法中啟動計算器。這里的代碼在上一章中基本都用過,在此不再描述。經(jīng)過上面的修改,我們可以非常方便的對其進(jìn)行調(diào)用,并且不需要任何的引用,實現(xiàn)了完全的解藕。下面的代碼,將指示我們?nèi)绾卧谥鞒绦蛑袉舆@些程序集。如下:2staticvoidMain(string[]args)3{4UnityContainerContainer=newUnityContainer();56Container.RegisterInstance<IServiceLocator>(7newUnityServiceLocatorAdapter(Container));89Container.RegisterType<IModuleInitializer,ModuleInitializer>();1011ILoggerFacadelogger=newTextLogger();12Container.RegisterInstance<ILoggerFacade>(logger);1314Container.RegisterType<IModuleCatalog,ConfigurationModuleCatalog>();1516Container.RegisterType<IModuleManager,ModuleManager>();1718IModuleManagerManager=Container.Resolve<IModuleManager>();19Manager.Run();20}上面的代碼中,ModuleInitializerTextLogger,ModuleCatalog三個類,都是ModuleManager的構(gòu)造函數(shù)中所需要的。如果不注冊,程序?qū)鲥e。在當(dāng)前框架中,實現(xiàn)了ILoggerFacade接口的類有多個。直接使用RegisterType來注冊,也將會報錯,我沒有看源代碼,不知道他的名稱是什么,所以在此直接使用實體注冊,這也可以實現(xiàn)同樣的效果。在程序啟動運(yùn)行時,Prism框架會去系統(tǒng)的配置文件中加獲取模塊的信息,并加它們加載到系統(tǒng)中。這些配置跟上一章中的類的配置不一樣,具體請參考下面的xml文件:2<?xmlversion="1.0"encoding="utf-8"?>3<configuration>4<configSections>5<sectionname="modules"6type="Microsoft.Practices.Prism.Modularity.ModulesConfigurationSection,Microsoft.Practices.Prism"/>7</configSections>8<modules>9<moduleassemblyFile="CommandParserLibrary.dll"10moduleType="CommandParserLibrary.InputParsingModule,CommandParserLibrary"11moduleName="Parsing"/>12<moduleassemblyFile="CalculatorLibrary.dll"13moduleType="CalculatorLibrary.CalculatorModule,CalculatorLibrary"14moduleName="Calculator"/>15<moduleassemblyFile="InputOutputLibrary.dll"16moduleType="InputOutputLibrary.InputOutputModule,InputOutputLibrary"17moduleName="InputOutput"/>18<moduleassemblyFile="MainModuleLibrary.dll"19moduleType="MainModuleLibrary.MainModule,MainModuleLibrary"20moduleName="Main">21<dependencies>22<dependencymoduleName="Parsing"/>23<dependencymoduleName="Calculator"/>24<dependencymoduleName="InputOutput"/>25
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 個人裝修委托書
- 雙方設(shè)備合作合同范本
- 南瓜訂貨合同范例
- 斷層解剖復(fù)習(xí)題+答案
- 合伙買車合作協(xié)議合同范例
- 七年級下學(xué)期語文總結(jié)
- 兼職游泳教練合同范本
- 保潔合同范本(完美版)
- 廠里員工租房合同范本
- 《贈劉景文》和《山行》古詩的教學(xué)反思
- 倉儲物流中心物業(yè)管理服務(wù)費(fèi)報價單
- 室內(nèi)給水管道安裝安全技術(shù)交底
- 全身望診課件
- 蘇教版三年級下冊《植物的一生》
- 《研學(xué)旅行課程設(shè)計》課件-理解研學(xué)課程設(shè)計內(nèi)涵
- 《西式點(diǎn)心制作》課件-抹茶戚風(fēng)蛋糕卷
- MOOC 體能攻略-浙江工商大學(xué) 中國大學(xué)慕課答案
- 部編版二年級語文下冊第一單元大單元整體作業(yè)設(shè)計
- 中國十五冶招聘線上筆試測評題庫
- xx基層團(tuán)支部建設(shè)培訓(xùn)
- 2020年山西省公務(wù)員錄用考試《行測》真題及答案
評論
0/150
提交評論