SearchDomainFactory.Instance已过时:'注射我!' (无法了解如何创建实例)

时间:2015-03-07 09:57:04

标签: resharper resharper-plugins resharper-sdk

我正在尝试将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!'

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

任何帮助都将非常感谢!谢谢,

问候

艾伦

1 个答案:

答案 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