Статические данные в расширении Visual Studio

У меня есть расширение Visual Studio, в котором большая часть функций написана через MEF. До сих пор моя индивидуальная функциональность рассчитана на ITextBuffer, поэтому я использовал элемент Properties для кэширования экземпляров.

Однако теперь у меня есть некоторые функции, которые должны быть для каждого проекта и для каждого решения. Классы EnvDTE предлагают объект Properties, но я не мог понять, могут ли они хранить мои собственные произвольные данные. Я действительно не хочу, чтобы мои собственные данные были статичными.

Как я могу хранить данные по проектам и решениям, не прибегая к глобальным переменным?

Редактировать:

Я мог бы также упомянуть, что, поскольку вы не можете использовать импорт MEF для статических данных, даже если вы скрываете его в чем-то вроде синглтона, использование маршрута глобальной переменной физически невозможно. Так что мне действительно нужно что-то неглобальное.

Редактировать:

Я говорю о ссылках на объекты, а не о постоянных значениях. Мне не нужно ничего хранить в файле решения или проекта, только с объектом.


person Puppy    schedule 01.10.2013    source источник
comment
Можете привести примеры / скриншоты? Я не очень хорошо знаком с MEF, и, вероятно, поэтому ваши вопросы мне кажутся непонятными.   -  person Neolisk    schedule 03.10.2013
comment
@Neolisk: Что вы хотите сделать на скриншоте? Документация MEF о том, что вы не можете импортировать статические элементы? Или документация EnvDTE.Solution / EnvDTE.Project, у которой нет доступного пользователю места для хранения?   -  person Puppy    schedule 03.10.2013
comment
Без обид, я просто пытаюсь увеличить шансы получить ответ на этот вопрос, если не я, то кто-то другой ответит. Чем больше информации вы предоставите, тем лучше. Вы же ведь не хотите сжигать свою награду даром, верно? Да, ссылки на соответствующие части документации помогут.   -  person Neolisk    schedule 03.10.2013
comment
Вы ищете IVsSolutionPersistence для каждого решения? для каждого проекта большинство иерархий системы проектов (не все) реализуют IVsBuildPropertyStorage.   -  person Simon Mourier    schedule 03.10.2013
comment
@SimonMourier: Нет, я обрабатываю непостоянные данные. Извините, это не очень понятно.   -  person Puppy    schedule 03.10.2013
comment
Я не думаю, что есть общее решение для любого типа проекта. Обязательные интерфейсы для проектов этого не предоставляют (IVsProject, IVsHierachy). Некоторые проекты могут поддерживать IVsHierarchy.SetProperty для любых значений пропид (например, если реализация просто поддерживается словарем без проверки). Для решения IVsSolution.SetProperty поддерживает только определенный набор свойств, к сожалению ...   -  person Simon Mourier    schedule 04.10.2013


Ответы (2)


Я нашел способ убедить MEF соблюдать мой статический импорт, поэтому пока я просто использую некоторые статические данные.

(Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(SComponentModel)) as IComponentModel).DefaultCompositionService.SatisfyImportsOnce(this);

Он был размещен где-то еще - может быть, даже на SO - мне потребовалось время, чтобы найти его. Обратите внимание, что this не имеет необходимого интерфейса - используется отражение, поэтому оно должно быть действительным для любого this.

person Puppy    schedule 04.10.2013

Если я правильно понимаю ваш вопрос, вы можете создать класс-заглушку, из которого вы выполняете экспорт, вместо того, чтобы пытаться принудительно экспортировать свои статические классы.

public class HostClass
{
   public static string StaticString
   { get  { return "string value"; } }
}

public class HostClassStub
{
   [Export("StaticStringValue", typeof(string))]
   public string StaticString
   { get { return HostClass.StaticString; } }
}

Вы также можете подумать о том, чтобы сделать статический класс нестатичным, если это для вас вариант. Помните, что по умолчанию импорт MEF является одиночным, поэтому он должен быть таким же, как наличие глобального набора переменных для каждого проекта, выполняющего импорт.

Я знаю, что это не касается аспекта VS Extensions вашей проблемы, но я не занимался этим. Возможно, это даст вам путь к вашему решению.

person Random    schedule 08.10.2013