上一章中,我以面向对象的思想,重构了一个简单的计算器解决方案,将其放入到了五个不同的程序集中,分别为: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函数的实现内容,如下:
1
static
void Main(
string[] args)
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)。将上段代码中注册过的五个类写入到配置文件中,如下所示:
2
<?
xml version="1.0" encoding="utf-8"
?>
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项目中。代码如下:
2
static
void Main(
string[] args)
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 }
时间过的真快,都转钟了。今天先到这里吧!虽然还没有完全实现程序集之间的解藕,但代码得更加简单、清晰。明天,我将继续对现有的代码进行重构,以实现完全的解藕。
先上传今天的代码。可以点击这里 下载!