在第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) { ... }
    ...
  }
}

相关文章: