工作区文件上下文
对 “打开文件夹 ”工作区的所有见解都由实现接口的 IFileContextProvider “文件上下文提供程序”生成。 这些扩展可能查找文件夹或文件中的模式、读取 MSBuild 文件和生成文件、检测包依赖项等,以便累积定义文件上下文所需的见解。 文件上下文本身不会执行任何操作,而是提供另一个扩展可以处理的数据。
每个 FileContext 属性都有一个 Guid
关联,用于标识它携带的数据类型。 工作区稍后会使用它 Guid
来将其与通过 Context 属性使用数据的扩展匹配。 文件上下文提供程序使用元数据导出,用于标识它可能为其生成数据的文件上下文 Guid
。
定义后,文件上下文可以与工作区中任意数量的文件或文件夹相关联。 给定的文件或文件夹可能与任意数量的文件上下文相关联。 这是一段多对多的关系。
文件上下文的最常见方案与生成、调试和语言服务相关。 有关详细信息,请参阅与这些方案相关的其他主题。
文件上下文生命周期
生命周期是不确定的 FileContext
。 随时,组件可以异步请求某些上下文类型集。 将查询支持某些请求上下文类型的子集的提供程序。 该 IWorkspace
实例通过 GetFileContextsAsync 该方法充当使用者和提供程序之间的中间人。 使用者可能会请求上下文并基于上下文执行一些短期操作,而另一些使用者可能请求上下文并维护长期引用。
更改可能会发生导致文件上下文过时的文件。 提供程序可以在事件上 FileContext
触发事件,以通知使用者更新。 例如,如果为某些文件提供了生成上下文,但磁盘上的更改使该上下文失效,则原始生成者可以调用该事件。 任何使用者仍引用, FileContext
然后可以重新查询新的 FileContext
。
注意
没有向使用者推送模型。 使用者在请求后不会收到提供商的新 FileContext
通知。
昂贵的文件上下文计算
从磁盘读取文件内容可能很昂贵,尤其是在提供程序需要解决文件之间的关系时。 例如,可以查询某个源文件的文件上下文的提供程序,但文件上下文依赖于项目文件中的元数据。 使用 MSBuild 分析项目文件或对其进行评估非常昂贵。 扩展可以导出在 IFileScanner
工作区索引期间创建 FileDataValue
数据。 现在,当请求文件上下文时, IFileContextProvider
可以快速查询该索引数据。 有关索引的详细信息,请参阅 工作区索引 主题。
警告
请谨慎对待其他计算成本高昂的方法 FileContext
。 某些 UI 交互是同步的,依赖于大量 FileContext
请求。 示例包括打开编辑器选项卡和打开解决方案资源管理器上下文菜单。 这些操作发出许多生成上下文类型请求。
与文件上下文相关的 API
- FileContext 保存数据和元数据。
- IFileContextProvider 并 IFileContextProvider<T> 创建文件上下文。
- ExportFileContextProviderAttribute 导出文件上下文提供程序。
- GetFileContextsAsync 用于使用者获取文件上下文。
- BuildContextTypes 定义打开文件夹将使用的生成上下文类型。
文件上下文操作
虽然本身 FileContext
只是有关某些文件的数据,但 IFileContextAction 这是表达和处理该数据的方法。 IFileContextAction
其用法十分灵活。 其中两种最常见的情况是生成和调试。
报告进度
该方法 ExecuteAsync 传递 IProgress<IFileContextActionProgressUpdate>
,但参数不应用作该类型。 IFileContextActionProgressUpdate
是一个空接口,并且调用 IProgress<IFileContextActionProgressUpdate>.Report(IFileContextActionProgressUpdate)
可能会引发 NotImplementedException
。 相反, IFileContextAction
必须根据需要将参数强制转换为另一种类型。
有关 Visual Studio 提供的类型的信息,请参阅相应的方案文档。
与文件上下文操作相关的 API
- IFileContextAction 根据 .
FileContext
. 执行某些行为。 - IFileContextActionProvider 创建 . 的
IFileContextAction
实例 - ExportFileContextActionProviderAttribute 导出类型
IWorkspaceProviderFactory<IFileContextActionProvider>
。
文件监视
工作区侦听文件更改通知并提供 IFileWatcherService 通过 GetFileWatcherService。 与“ExcludedItems”设置匹配的文件不会生成文件通知事件。 事件之间的阈值用于通知简化和重复减少。 需要对文件更改做出反应时,应订阅此服务。
提示
默认情况下,工作区的 索引服务 订阅文件事件。 文件添加和修改将导致为该文件的新数据调用相关的 IFileScanner
事件。 文件删除将删除索引数据。 无需订阅 IFileScanner
文件观察程序服务。