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