0

我正在尝试将 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'。我可以通过更新的构造函数进行实例化的最接近如下;

新的 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!'

明显的下一个问题..好的,怎么样?我如何“注入你”?我找不到关于这个新的重大更改的任何文档,事实上,我找不到任何文档(或示例项目)甚至提到DrivenRefactoringWorkflowRenameWorkflow,(现在需要新 SearchDomainFactory 的类),或任何关于SearchDomainFactory.Instance突然过时的信息以及如何满足“注入”它的需要。

非常感激任何的帮助!谢谢,

问候

艾伦

4

1 回答 1

1

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

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

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

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

于 2015-03-10T10:02:31.630 回答