在第6篇和第7篇里,我们创建了一个名为StartupToolset的示例package,并且手动地添加了一个菜单项和工具窗。在这篇文章里,我们将重构这个package,提取独立的服务模块出来。
我们这个示例package有很多地方可以重构:不仅可以做提取服务之类的结构调整,也可以封装可重用的代码,以便供以后调用或提高代码可读性。在下一篇文章里我们将封装可重用的代码,但在这一篇里,我们把精力放在服务上。
复制一份StartupToolset
为了在重构之前保留目前的StartupToolset的版本,我把这个package复制了一份,并命名为StartupToolsetRefactored。你可以参考第6篇和第7篇的内容自己来做一个副本:新建一个空的名为StartupToolsRefactored的package,并且根据第6篇的内容为它添加一个菜单项,根据第7篇的内容添加一个工具窗。
为了避免和前一个package冲突,要修改一下StartupToolsRefactored里的GUID,并且修改一下菜单命令的显示文本,这样就可以在界面上和旧版的package区分开来。
创建一个全局服务(global service)
在重构的第一步,我们将把“计算引擎”做成一个全局服务。这样的话别的package就可以调用我们这个服务的功能了。
到目前为止,“计算”的逻辑是直接嵌入到我们的工具窗的用户控件CaculationControl类里的。这段逻辑放在了CalculateButton_Click事件处理方法里,这样我们的代码看起来就非常简单并且容易懂。但是在这种结构下,计算逻辑和我们的package是紧耦合的:
public partial class CalculationControl : UserControl
{
...
private void CalculateButton_Click(object sender, EventArgs e)
{
try
{
int firstArg = Int32.Parse(FirstArgEdit.Text);
int secondArg = Int32.Parse(SecondArgEdit.Text);
int result = 0;
switch (OperatorCombo.Text)
{
case "+":
result = firstArg + secondArg;
break;
...
}
ResultEdit.Text = result.ToString();
}
catch (SystemException) { ... }
...
}
}