上一章中,我以面向對象的思想,重構了一個簡單的計算器解決方案,將其放入到了五個不同的程序集中,分別為:CalculatorLibrary、CommandParserLibrary、InputOutputLibrary、InterfaceLibrary和CommonTypesLibrary。InterfaceLibrary中記錄了整個解決方案所有對外公開的接口。今天將對其進行進一步的重構,其目的是為了解藕程序集之間的依懶關系。Prism中提供了兩種框架用於實現這種解藕,分別是Unity和MEF。下面將使用Unity來實現初步的解藕,這將為使用Prism進行徹底的解藕創造條件。
我下載的是Prism 4.1,這個版本可以支持.NET Framework 4.0平台和 Silverlight 5.0, 是當前的最新版本。安裝路徑: C:\Prism。操作過程如下:
一,在Application項目中添加Prism引用, 引用的dll文件的路徑為:C:\Prism\Lib\Desktop\Unity\Microsoft.Practices.Unity.dll
二,更改Application項目中Main函數的實現內容,如下:
2 {
3 UnityContainer Container = new UnityContainer();
4
5 Container.RegisterType<ICalculator, Calculator>();
6 Container.RegisterType<IInputService, ConsoleInputService>();
7 Container.RegisterType<IOutputService, ConsoleOutputService>();
8 Container.RegisterType<IInputParserService, InputParserService>();
9 Container.RegisterType<ICalcutorReplLoop, CalcutorReplLoop>();
10
11 ICalcutorReplLoop loop = Container.Resolve<ICalcutorReplLoop>();
12 loop.Run();
13 }
Unity首先注冊所有需要用到的程序集到 UnityContainer的實例中。代碼中的:Container.RegisterType方法是其中的一種,我們可以發現,Register方法有多種不同的實現,可用於不同環境下的注冊。當需要使用時,可以使用Resolve方法加載程序集中的某個接口。並通過這個接口,使用程序集中的業務邏輯,這樣就不需要知道其內部的具體實現了。如果僅僅只能以代碼的方式來進行注冊,那么這樣的程序顯然還缺少足夠的靈夠性。萬幸的是Unity支持從配置文件中加載注冊信息並自動完成注冊。這種方法將能減少我們的代碼量,更重要的是能讓我們可以用更加靈活的方式來開發可插拔的應用程序模塊。以上面需要注冊的五個類為例來看看是如何實現的:
首先,在Application項目中添加應用程序配置文件(App.config)。將上段代碼中注冊過的五個類寫入到配置文件中,如下所示:
3 < configuration >
4 < configSections >
5 < section name ="unity"
6 type ="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
7 </ configSections >
8 < unity >
9 < containers >
10 < container >
11 < types >
12 < type type ="CalculatorLibrary.ICalculator, InterfaceLibrary"
13 mapTo ="Application.Calculator, CalculatorLibrary" />
14 < type type ="CalculatorLibrary.ICalcutorReplLoop, InterfaceLibrary"
15 mapTo ="Application.CalcutorReplLoop, CalculatorLibrary" />
16 < type type ="CommandParserLibrary.IInputParserService, InterfaceLibrary"
17 mapTo ="Application.InputParserService, CommandParserLibrary" />
18 < type type ="InputOutputLibrary.IInputService, InterfaceLibrary"
19 mapTo ="Application.ConsoleInputService, InputOutputLibrary" />
20 < type type ="InputOutputLibrary.IOutputService, InterfaceLibrary"
21 mapTo ="Application.ConsoleOutputService, InputOutputLibrary" />
22 </ types >
23 </ container >
24 </ containers >
25 </ unity >
26 </ configuration >
使用配置文件注冊程序集,能為程序員減少一部分代碼。當然,也需要自己增加一系列的配置。在對配置文件的格式不夠清楚的情況下,編輯配置文件比寫代碼可能會更加繁瑣。如果有時間的話,有必要去寫一個配置文件的生成工具,以減少出錯的幾率和提高開發效率。呵呵,這都是后話了,先接着看看代碼部份吧。
為了從配置文件中讀取這些信息,需要添加引用: System.Configuration的引用。接着將Microsoft.Practices.Unity.Configuration.dll 文件引用到Application項目中。代碼如下:
3 {
4 UnityContainer Container = new UnityContainer();
5 UnityConfigurationSection configSection = (UnityConfigurationSection)ConfigurationManager.GetSection( " unity ");
6 configSection.Configure(Container);
7
8 ICalcutorReplLoop loop = Container.Resolve<ICalcutorReplLoop>();
9 loop.Run();
10 }
時間過的真快,都轉鍾了。今天先到這里吧!雖然還沒有完全實現程序集之間的解藕,但代碼得更加簡單、清晰。明天,我將繼續對現有的代碼進行重構,以實現完全的解藕。
先上傳今天的代碼。可以點擊這里 下載!