我正在尝试将R#扩展项目从R#6迁移到R#8。(我已经接管了某人编写的项目,而且我是新的写扩展名。)
在现有的v6项目中,有一个派生自RenameWorkflow的类,并且构造函数看起来像这样;
public class RenameStepWorkflow : RenameWorkflow
{
public RenameStepWorkflow(ISolution Solution, string ActionId)
: base(Solution, ActionId)
{
}
这曾经在R#SDK v 6中工作,但现在在V8中,RenameWorkflow不再具有采用Solution和actionId的构造函数。新的构造函数签名现在看起来像这样;
public RenameWorkflow(
IShellLocks locks,
SearchDomainFactory searchDomainFactory,
RenameRefactoringService renameRefactoringService,
ISolution solution,
string actionId);
现在是我的问题,我需要帮助(我认为)
我已经复制了构造函数,现在这个类的构造函数必须满足这些新的依赖项。通过一些挖掘,我设法找到了一种满足所有依赖关系的方法,除了' SearchDomainFactory' 。我可以通过更新的构造函数实例化的最接近的内容如下:
new RenameStepWorkflow(Solution.Locks,JetBrains.ReSharper.Psi.Search.SearchDomainFactory.Instance,RenameRefactoringService.Instance,this.Solution,null)
所有看起来都很好,除了JetBrains.ReSharper.Psi.Search.SearchDomainFactory.Instance
被标记为已过时,并且给我一个我无法解决的编译错误,即使使用#pragma
也不允许我编译代码。我编译时得到的确切错误消息是Error 16 'JetBrains.ReSharper.Psi.Search.SearchDomainFactory.Instance' is obsolete: 'Inject me!'
明显的下一个问题......怎么样?我如何“注射你”?我找不到关于这个新的重大变化的任何文档,事实上,我找不到任何甚至提到DrivenRefactoringWorkflow
或RenameWorkflow
的文档(或示例项目),(现在需要新的SearchDomainFactory的类),或者SearchDomainFactory.Instance
上的任何信息现在突然变得过时,以及如何满足“注入”的需要。它
任何帮助都将非常感谢!谢谢,
问候
艾伦
答案 0 :(得分:1)
ReSharper有自己的IoC容器,它负责创建类的实例,并且#34;注入"依赖关系作为构造函数参数。标有[ShellComponent]
或[SolutionComponent]
等属性的类由容器处理,分别在应用程序启动或加载解决方案时创建。
依赖关系应该作为构造函数参数注入,而不是使用GetComponent<TDependency>
或静态Instance
属性等方法,因为这允许容器控制依赖生存期,并确保依赖于适当的组件,而不是创建泄漏 - 例如,shell组件不能依赖于解决方案组件,在创建shell组件时它不会存在。
ReSharper在几个版本之前引入了IoC容器,并且已经更新了大部分代码库以正确使用它,但是有一些保留,其中的事情仍然以不太理想的方式完成 - 静态Instance
属性和对GetComponent
的调用。这就是你遇到的。您应该能够通过将其作为构造函数参数放在组件中来获取SearchDomainFactory
的实例。
您可以在偏离设置中找到有关组件模型(IoC容器和相关功能)的更多信息:https://www.jetbrains.com/resharper/devguide/Platform/ComponentModel.html