为数据库项目创建自定义功能
可以通过添加自己的功能来扩展现有数据库项目类型。 例如,可以创建一个功能,使之在每次加载或保存数据库项目时执行某些操作。 还可以创建自己的数据库架构提供程序和支持项目系统。 然而,本文不涉及这种类型的扩展性。
常规任务
常规任务 |
支持内容 |
---|---|
了解有关扩展点的更多信息:可以了解数据库项目扩展性的设计。 |
|
创建示例项目功能:了解创建一个自定义项目功能所需的步骤,该功能在加载数据库项目时显示对话框。 如果您执行这些演练,则将:
|
|
安装自定义项目功能:在创建并生成项目功能后,必须先进行安装,Visual Studio 才会识别该功能。 |
项目扩展性的目标
Visual Studio 2010 中数据库项目扩展性功能的主要目标如下所示:
通过接口公开主要组件
此方法使用接口(而不是抽象类)使项目系统与架构模型保持一致。 一个具体类应实现多个接口。功能由扩展性管理器创建
功能负责系统的主要部分,包括解决方案资源管理器、架构视图、项目升级以及项目属性。功能可以进行扩展
功能可以使用扩展性管理器、XML 文件、注册表或其他方法提供该扩展性。服务通过自有接口进行公开
DataPackage 实现 IServiceProvider。 功能之间的所有交互通信应通过这些级别的服务进行处理。 不应将功能公开为服务。 而应创建新接口(即包装类),然后将包装公开为服务。事件驱动项目系统
DataPackage 和 ProjectNode() 提供一些事件,这些事件可使功能驱动项目系统。 此外,功能可以通过其服务接口提供事件。 在某些情况下,您可能决定使用委托。 若要决定使用哪个功能处理操作,请考虑使用功能可以基于优先级进行交互的事件方法。不要依赖于侦听器的顺序
如果针对某事件的侦听器的顺序十分重要,请考虑创建一个 Pre 或 Post 事件,或考虑将优先级属性添加到从 EventArg 派生的类。
组件模型程序集
以下程序集提供 Visual Studio 中的数据库项目系统。
Microsoft.VisualStudio.Data.Schema.Package.dll
基项目系统,提供功能引导和事件处理。 这包括数据库不可知的功能,如脚本。Microsoft.VisualStudio.Data.Schema.PackageUI.dll
数据库不可知的包的附属程序集。Microsoft.VisualStudio.Data.Schema.Package.Sql.dll
Visual Studio 的特定于 SQL Server 的功能、编辑器和工具窗口。Microsoft.VisualStudio.Data.Schema.Package.SqlUI.dll
特定于 SQL Server 的功能、编辑器和工具窗口的附属程序集。
扩展点
可以扩展数据库项目系统的以下点:
IDatabaseProjectFeature (AllowMultipleExtensions =true)
这是项目系统的主扩展点。 功能旨在控制项目和提供帮助。 它们可以选择实现以下几个接口:IOleCommandTarget、IDatabaseProjectPriorityCommandTarget、IDatabaseProjectPropertyPageContributor、IDatabaseProjectExtenderContributor<TExtendee>、IDatabaseProjectAddNewItemParticipant、IDatabaseProjectIdleProcessor 和 IDatabaseProjectPartialProjectParticipant。IDatabaseProjectBuildActionContributor (AllowMultipleExtensions =false)
向项目系统中的可能生成操作列表提供 BuildAction 字符串。例如,SQL Server 项目系统提供 Predeploy 和 Postdeploy。IDatabaseProjectUserFileContributor (AllowMultipleExtensions =false)
指定应路由到 .user 文件的属性。IDatabaseSchemaViewController (AllowMultipleExtensions =false)
填充架构视图并响应来自该视图的事件。IDatabaseProjectFileUpgradeController (AllowMultipleExtensions =false)
将项目文件作为 XML 文档进行升级。 此过程在 Visual Studio 项目系统尝试通过项目工厂加载项目实例之前发生。IDatabaseProjectReferenceController (AllowMultipleExtensions = false)
控制项目引用IDatabaseProjectPartialProjectParticipant (AllowMultipleExtensions = true)
使功能可以筛选出不得作为分部项目导出的文件。IDatabaseProjectHelpKeywordProvider
提供在客户按 F1 时使用的项目系统帮助关键字。
数据库项目生命周期
每个数据库项目文件 (.dbproj) 都包含一个名为“DSP”的属性,该属性指示在 Visual Studio 中打开此项目时将对此项目进行处理的特定 DatabaseSchemaProvider。 项目系统使用此 DSP 创建一个扩展管理器,并从其构造所有项目系统参与者和项目功能。 每个功能都接收一个 Initialize 事件,以便能够通过侦听事件将自身初始化并根植于项目系统中。
在项目打开/关闭和保存过程中会引发以下事件:
NewProjectCreated
此事件在第一次创建项目时发生。 可以处理此事件,以显示向导或设置对话框。ProjectOpening
项目正在打开。 可以处理此事件,以将任何服务添加到 IDatabaseProjectNode。ProjectOpened
此事件在添加了所有服务且项目已完成打开时发生。 然而,项目此时尚未完成对其上一个状态的反序列化。 TaskHost 和 DataSchemaModel 一直为 NULL,直至发送 ProjectLoaded 事件。ProjectLoaded
项目已完全加载。 TaskHost 和 DataSchemaModel 已可供使用。ProjectClosing
项目正在关闭。 这是保存处于项目文件之外的任何状态信息的好机会。ProjectClosed
项目已关闭。ProjectSaving
项目正在执行保存操作。 可以此为契机,确保功能处于可存储其持久性的状态。ProjectSaved
项目已保存。
错误管理
每个项目都有一个 ErrorManager。 有些错误会保存到 .dbmdl 文件中,而有些错误不会。 这可以通过 AddPersistedCategory 类进行控制。 默认情况下,会保存以下类别:ModelCategory、ValidationAtBuildCategory 和 ValidationOnIdleCategory。 如果您添加另一个保存的类别,则必须处理项目重新加载,并验证和管理您的错误。 请记住,虽然项目已关闭,但是用户可能编辑了 .dbproj 文件,以致移除了您为之报告错误的文件。 这会令用户感到十分困惑:既然不存在这样的文件,为何还要报告项目中的错误。
数据库错误对象会添加到 ErrorManager 中的特定类别中。 这样做的原理是,项目功能可以通过其类别的生存期来管理其错误的生存期。 如果您担心类别名称与其他功能冲突,请将 GUID 用作名称。 ErrorManager 定义几个内置类别,包括:
DefaultCategory
此类别旨在供您用于生存期等于项目生存期的错误。 因此,举例来说,在项目加载过程中发生的一些错误会添加到此类别。ModelCategory
此类别应由架构管理器在遇到分析器错误之类的错误时使用。