2

我有一个 Visual Studio 扩展,其中大部分功能都是通过 MEF 编写的。到目前为止,我的个人功能是 per ITextBuffer,所以我使用了 Properties 成员来缓存实例。

但是,现在我有一些功能需要每个项目和每个解决方案。EnvDTE 类提供了一个 Properties 对象,但我不知道它们是否可以存储我自己的任意数据。我真的不想让自己的数据静态化。

如何存储每个项目和每个解决方案的数据而不必求助于全局变量?

编辑:

我还可能会提到,由于您不能将 MEF 导入用于静态数据,即使您将其隐藏在单例中,那么使用全局变量路由在物理上也是不可能的。所以我真的,真的需要一些不是全球性的东西。

编辑:

我说的是对象引用,而不是持久值。我不需要在解决方案或项目文件中存储任何内容,只需使用对象即可。

4

2 回答 2

0

我找到了一种方法来说服 MEF 尊重我的静态导入,所以现在,我只使用一些静态数据。

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

它被张贴在其他地方——甚至可能是在 SO 上——不过我花了一段时间才找到它。请注意,this不需要接口 - 使用反射,因此它应该对任何 this.

于 2013-10-04T19:05:34.137 回答
0

如果我正确理解您的问题,您可以创建一个用于导出的存根类,而不是试图强制您的静态类导出。

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 扩展方面,但我还没有处理这些问题。不过,也许这将为您提供解决方案的途径。

于 2013-10-08T13:24:53.850 回答