0

是否可以使用 Resharper 重构代码,以便将以下方法Eat提取到单独的类中,并将新提取的Dinner类作为外部依赖注入到类中?

原始代码

public class Dinner
{
    public Dinner()
    {

    }

    public void Eat()
    {
        //do the eating
    }
}

重构代码

public interface IEatService
{
    void Eat();
}

public class EatService : IEatService
{
    public void Eat()
    {

    }
}
public class Dinner
{
    private readonly IEatService _eatService = null;

    public Dinner(IEatService eatService)
    {
        _eatService = eatService;
    }

    public void Eat()
    {
        _eatService.Eat();
    }

}

它不必与重构的代码完全一样——这可以给出一个想法。

4

2 回答 2

3

您可以在 R# 7 中使用三步重构几乎按照您的意愿进行操作:

  1. 将插入符号放在您的 Eat 方法中,调用 Extract Class 重构(在 VS 中为 Ctrl-Shift-R),将您的类命名为 EatService。
  2. 将插入符号放在您的 EatService 类中,调用提取接口重构。
  3. 将插入符号放在您的 EatService 类中,调用 Use Base type Where possible refactoring。

剩下的就是在 Dinner 类中修复一个构造函数,以便将 IEatService 作为参数。

于 2013-01-06T21:30:42.493 回答
0

使用 R# 6,实现此目的的一种方法是使用此操作序列。ReSharper | Refactor请注意,菜单栏上的重构都可用,或者(更快)在上下文中使用Ctrl+ Shift+ R。还有一点打字;如果有一种方法不需要您输入任何内容,我不会感到惊讶。

  • 从名为的文件中的原始代码开始Dinner.cs
  • 将光标放在 上Eat,使用Extract Interface重构,命名接口IEatService
  • 将光标放在IEatService, Alt+上Enter并创建一个派生类型,接受提供的EatService, 和Alt+名称Enter以填充方法实现主体
  • 这是我们必须输入的地方: In Dinner.Eat(), type _eatService.Eat();。注意_eatService是红色的;Alt+Enter在其上,选择“创建字段”,将提供的类型更改为IEatService
  • 将光标放在_eatService, Alt+的定义上,Enter然后选择“从 ctor 参数初始化,然后再次Alt+Enter并接受readonly建议

请注意,初始化_eatServicenull是多余的;R# 会让你知道这一点。

我们现在位于您的目标代码处。

我认为 R# 7 有一些新的重构(例如提取类),这可能会使这更快。

于 2013-01-04T15:32:37.883 回答