Resharper(或Visual Studio)将更改级联到构造函数的快捷方式

Resharper(或Visual Studio)将更改级联到构造函数的快捷方式,resharper,Resharper,下面是一个常见的重构,我认为我还没有看到它的捷径: 假设我们有一个基类,它有许多继承子类。基类使用构造函数注入来接受许多服务: class FooBase { private IMyService _myService; private IMyOtherService _myOtherService; public FooBase(IMyService myService, IMyOtherService _myOtherService) {

下面是一个常见的重构,我认为我还没有看到它的捷径:

假设我们有一个基类,它有许多继承子类。基类使用构造函数注入来接受许多服务:

class FooBase
{
    private IMyService _myService;
    private IMyOtherService _myOtherService;

    public FooBase(IMyService myService, IMyOtherService _myOtherService)
    {
         _myService = myService;
         _myOtherService = myOtherService;
    }
}

class FooConcrete : FooBase
{
    public FooConcrete(IMyService myService, IMyOtherService _myOtherService)
        base(myService, myOtherService)
    {
    }
}
请注意FooConcrete如何调用其基类FooBase的构造函数

现在,如果我想向FooBase添加另一个服务,会发生什么?我可以从FooBase的构造函数中快速初始化新的私有字段。但我仍然需要手动更新从FooBase继承的每个子类。如果有很多继承类,这可能会很麻烦


有没有快捷方式,或者我可以使用的技巧,来快速更新所有子类的构造函数?

构建,然后修复编译错误

ReSharper没有这方面的工具,包括今天发布的ReSharper 6中的AFAIK。

ReSharper重构的参数类 如果您知道构造函数可以在整个生命周期中更改,则可以创建如下参数类:

class FooInfo
{
    IMyService MyService {get; set;}
    IMyOtherService MyOtherService {get; set;}
}
并且可以将这样的对象传递给构造函数,即:

class FooBase
{
    private FooInfo _fooInfo;

    public FooBase(FooInfo fooInfo)
    {
         _fooInfo= fooInfo;
    }
}

class FooConcrete : FooBase
{
    public FooConcrete(FooInfo fooInfo)
        base(fooInfo)
    {
    }
}
然后,如果需要一个新参数,只需将其添加到
FooInfo
类中即可。不需要更改子类

ReSharper有一个重构,用于从构造函数参数生成这样的参数类:
将光标放在代码文件中的构造函数名称上,
按Ctrl+Shift+R和
选择从参数中提取类…

更改签名中的默认值 我知道的最好的方法是通过更改签名(Ctrl+R,S)将新的服务参数添加到
FooBase
构造函数中,并使用适当的参数名默认值,例如
yetAnotherService

在此之后,在所有子类构造函数中的
base
调用中确实存在错误。但您只需按3个键即可修复每个错误:
-通过Alt+Shift+Page Down转到错误 -通过按住Alt键并按Enter键打开关联菜单,
-通过输入选择第一个选项(在包含构造函数中创建参数“yetAnotherService”)


好的,你还有很多关键点。但这是我知道的最快的方法(使用ReSharper 5.1.3)。

自从我问了这个问题后,ReSharper现在已经添加了支持,作为该功能的一部分

例如,要向基类中的构造函数添加参数,请使用以下方法:

  • 右键单击要更改的构造函数,选择重构->更改签名

  • 进行所需的更改,然后单击“下一步”。选择“通过呼叫树解决”,然后单击下一步

  • 您的更改将被执行,VisualStudio中的某个地方将打开一个名为“重构-更改签名”的窗口。此窗口中将显示继承类的列表

  • 双击每个类并选择“在构造函数y中创建参数x”


  • 是的,这有时是一个选项,但如果您使用的是依赖于构造函数注入的DI框架,则并非如此。