SearchDomainFactory.Instance устарел: "Введите мне!" (Не могу узнать, как создать экземпляр)

Я пытаюсь перенести проект расширения 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!'

Очевидный следующий вопрос.. ладно, как? Как мне "сделать тебе инъекцию"? Я не могу найти документацию по этому новому критическому изменению, фактически, я не могу найти документацию (или примеры проектов), в которой даже упоминается DrivenRefactoringWorkflow или же RenameWorkflow(классы, которым теперь требуется новый SearchDomainFactory) или любая информация о SearchDomainFactory.Instance вдруг теперь устарел и как удовлетворить необходимость "впрыскивать" его.

Любая помощь будет наиболее ценится! Спасибо,

С уважением

Алан

1 ответ

Решение

ReSharper имеет свой собственный контейнер IoC, который отвечает за создание экземпляров классов и "внедрение" зависимостей в качестве параметров конструктора. Классы, отмеченные такими атрибутами, как [ShellComponent] или же [SolutionComponent] обрабатываются контейнером, созданным при запуске приложения или загрузке решения, соответственно.

Зависимости должны быть введены как параметры конструктора, а не с помощью таких методов, как GetComponent<TDependency> или статический Instance свойств, поскольку это позволяет контейнеру управлять временем жизни зависимости и гарантировать, что вы зависите от соответствующих компонентов, а не создаете утечки - компонент оболочки, например, не может зависеть от компонента решения, он не будет существовать, когда компонент оболочки создано.

ReSharper представил контейнер IoC несколько выпусков назад, и значительная часть кодовой базы была обновлена ​​для его правильного использования, но есть несколько задержек, когда все еще делается не идеальным образом - статический Instance свойства и звонки GetComponent, Это то, что вы столкнулись. Вы должны быть в состоянии получить экземпляр SearchDomainFactory поместив его в качестве параметра конструктора в вашем компоненте.

Вы можете узнать больше о Компонентной модели (контейнер IoC и связанные функции) в devguide: https://www.jetbrains.com/resharper/devguide/Platform/ComponentModel.html

Другие вопросы по тегам