Prism學(xué)習(xí)(3)-實現(xiàn)可插拔的模塊_第1頁
Prism學(xué)習(xí)(3)-實現(xiàn)可插拔的模塊_第2頁
Prism學(xué)習(xí)(3)-實現(xiàn)可插拔的模塊_第3頁
Prism學(xué)習(xí)(3)-實現(xiàn)可插拔的模塊_第4頁
Prism學(xué)習(xí)(3)-實現(xiàn)可插拔的模塊_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論