代码之家  ›  专栏  ›  技术社区  ›  Puppy

Visual Studio扩展中的静态数据

  •  2
  • Puppy  · 技术社区  · 12 年前

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

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

    如何在不使用全局变量的情况下存储每个项目和每个解决方案的数据?

    编辑:

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

    编辑:

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

    2 回复  |  直到 12 年前
        1
  •  0
  •   Puppy    12 年前

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

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

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

        2
  •  0
  •   Random    11 年前

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

    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导入是singleton,所以它应该就像为每个执行导入的项目都有一组全局变量一样。

    我知道这并不能解决你的VS扩展问题,但我还没有处理过这些问题。不过,也许这会给你一条通往解决方案的道路。

    推荐文章