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现在已经添加了支持,作为该功能的一部分 例如,要向基类中的构造函数添加参数,请使用以下方法:
是的,这有时是一个选项,但如果您使用的是依赖于构造函数注入的DI框架,则并非如此。