SearchDomainFactory.Instance 已过时:'Inject me!'(找不到如何创建实例)

SearchDomainFactory.Instance is obsolete: 'Inject me!' ( Can't find out how to create instance)

我正在尝试将 R# 扩展项目从 R# 6 迁移到 R# 8。(我接管了某人编写的项目,但我是编写扩展的新手。 )

在现有的v6项目中有一个class派生自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);

现在这是我需要帮助的问题(我认为)

我已经复制了构造函数,现在这个 class 的构造函数必须满足这些新的依赖关系。通过一些挖掘,我设法找到了一种满足所有依赖关系的方法,除了 '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!'

下一个问题很明显..好吧,怎么样?我如何'inject you'?我找不到关于这个新的重大变化的任何文档,事实上,我找不到任何甚至提到 DrivenRefactoringWorkflowRenameWorkflow 的文档(或示例项目),(现在需要的 classes新的 SearchDomainFactory),或者关于 SearchDomainFactory.Instance 突然过时以及如何满足 'inject' 需要的任何信息。

如有任何帮助,我们将不胜感激!谢谢,

问候

艾伦

ReSharper 有自己的 IoC 容器,它负责创建 类 的实例和 "injecting" 依赖项作为构造函数参数。标有 [ShellComponent][SolutionComponent] 等属性的 类 由容器处理,分别在应用程序启动或加载解决方案时创建。

依赖项应该作为构造函数参数注入,而不是使用像 GetComponent<TDependency> 或静态 Instance 属性这样的方法,因为这允许容器控制依赖项的生命周期,并确保您依赖于适当的组件,而不是造成泄漏 - shell 组件不能依赖于解决方案组件,例如,在创建 shell 组件时它不会存在。

ReSharper 在几个版本前引入了 IoC 容器,大部分代码库已更新以正确使用它,但仍有一些保留,事情仍然以不太理想的方式完成- 静态 Instance 属性和对 GetComponent 的调用。这是你遇到的。您应该能够通过将 SearchDomainFactory 的实例作为构造函数参数放入组件中来获取它。

您可以在开发指南中找到有关组件模型(IoC 容器和相关功能)的更多信息:https://www.jetbrains.com/resharper/devguide/Platform/ComponentModel.html