我已经创建了Classifier
,ErrorTagger
,SignatureHelp
和TextCompletion
个类。这些都是由VS发现的MEF组件提供商创建的。
问题是,我想在这些组件之间共享一个C#对象来共享状态,并允许我保存从每个组件重新分析相同的文本。我怎样才能做到这一点?我需要这个状态来编辑每个文件。
VS发现提供程序并使用它们创建我的组件。但是,我如何在他们之间传递或分享状态?我确实使用了全局单例,但是当我在VS中编辑了多个文件时,它们都共享相同的单例,但是我需要为每个正在编辑的文件设置不同的实例。
答案 0 :(得分:1)
一种常见的方法是ITextView
和ITextBuffer
都有一个Properties属性,你可以将它作为一个通用的包放入其中。甚至还有一个GetOrCreateSignletonProperty助手。通常有某种组件可以监视ITextBuffer
进行更改并以这种方式进行解析,而每个其他组件只是抓取每个文本缓冲区对象。
分类器和标记器也可以实现IDisposable
,ITextViews
有一个close事件,所以也可以在ITextBuffer
/ ITextView
之间的某个地方设置一个静态字典你自己的类型和管理生命周期。
你要么这样做 - 测试!很容易意外搞砸和泄漏ITextBuffer
或ITextView
。