如何:开发实例查询提供程序
以下过程提供创建自定义实例查询提供程序的步骤。
创建一个 Class Library 项目。
向 Microsoft.ApplicationServer.StoreManagement.dll 添加引用。此外,向 System.Configuration.dll 和 System.Data.dll 添加引用以编译本主题中提供的示例代码。
在源文件的开头添加以下语句。
using Microsoft.ApplicationServer.StoreManagement.Query; using System.Collections.Specialized; using System.Data; using System.Data.SqlClient;
为从 InstanceStoreProvider 类派生的实例查询提供程序创建一个类。
public sealed class MySqlInstanceQueryProvider : InstanceQueryProvider { }
实现 Initialize 方法。此方法接受与配置文件中指定的配置信息对应的属性包。在此属性包中的数据用于构造提供程序。在调用 CreateInstanceStore 或 UniqueProviderIdentifier 方法之前,调用 Initialize 方法。
备注
在远程方案中,名称/值集合包含名为“EnableServiceModelMetadata”的项目。提供程序可以选择在调用 base.Initialize 方法之前忽略和删除此参数此属性通常用于确定是否调用 Microsoft.Web.Administration.ServerManager 对象上的 SetMetadata(“ServiceModel”,true)。
string storeName; string ConnectionString { get; set; } public override void Initialize(string name, NameValueCollection config) { this.storeName = name; this.ConnectionString= config["connectionString"]; // Initialize the base class base.Initialize(name, config); }
实现 InstanceQueryProvider 类的 CreateInstanceQuery 方法以返回自定义 InstanceQuery 对象。
public override InstanceQuery CreateInstanceQuery() { SqlConnectionStringBuilder connectionStringBuilder = new SqlConnectionStringBuilder(this.ConnectionString); connectionStringBuilder.AsynchronousProcessing = true; return new MySqlInstanceQuery(this.storeName, connectionStringBuilder.ConnectionString); }
备注
请参阅下一部分:实现 MySqlInstanceQuery 类型。
实现 UniqueProviderIdentifier 方法。此方法返回的唯一提供程序 ID 用于确定不同的提供程序对象是否解析为相同的基础存储。
string UniqueStoreIdentifier { get; set; } public override string UniqueProviderIdentifier() { this.UniqueStoreIdentifier = GetUniqueStoreIdentifier(this.ConnectionString); return this.UniqueStoreIdentifier; } private string GetUniqueStoreIdentifier(string connectionString) { using (SqlConnection connection = new SqlConnection(connectionString)) { using (SqlCommand command = new SqlCommand()) { command.CommandType = CommandType.Text; command.CommandText = "SELECT TOP (1) [StoreIdentifier] FROM [Microsoft.ApplicationServer.DurableInstancing].[StoreVersion]"; command.Connection = connection; command.Connection.Open(); Guid identifier = (Guid)command.ExecuteScalar(); return identifier.ToString(); } } }
实现 InstanceQuery
以下过程提供创建自定义 InstanceQuery 类型的步骤。
创建从 InstanceQuery 类派生的类。
public sealed class MySqlInstanceQuery : InstanceQuery { string storeName; string connectionString; public MySqlInstanceQuery(string storeName, string connectionString) { this.storeName = storeName; this.connectionString = connectionString; } }
实现 BeginExecuteQuery 方法。客户端使用此方法查询实例。
public override IAsyncResult BeginExecuteQuery(InstanceQueryExecuteArgs args, TimeSpan timeout, AsyncCallback callback, object state) { //uncomment the following line to compile the project or implement the method //throw new NotImplementedException(); }
实现 EndExecuteQuery 方法。此方法应返回 InstanceInfo 对象的集合。
public override IEnumerable<InstanceInfo> EndExecuteQuery(IAsyncResult result) { //uncomment the following line to compile the project or implement the method //throw new NotImplementedException(); }
实现 BeginExecuteCount 方法。客户端使用此方法查询实例计数。
public override IAsyncResult BeginExecuteCount(InstanceQueryArgs args, TimeSpan timeout, AsyncCallback callback, object state) { //uncomment the following line to compile the project or implement the method //throw new NotImplementedException(); }
实现 EndExecuteCount 方法。此方法应返回实例计数。
public override int EndExecuteCount(IAsyncResult result) { //uncomment the following line to compile the project or implement the method //throw new NotImplementedException(); }
实现 BeginExecuteGroupCount 方法。客户端使用此方法针对实例存储查询分组实例计数。
public override IAsyncResult BeginExecuteGroupCount(InstanceQueryGroupArgs args, TimeSpan timeout, AsyncCallback callback, object state) { //uncomment the following line to compile the project or implement the method //throw new NotImplementedException(); }
实现 EndExecuteGroupCount 方法。此方法应返回 GroupingResult 对象的集合。
public override IEnumerable<GroupingResult> EndExecuteGroupCount(IAsyncResult result) { //uncomment the following line to compile the project or implement the method //throw new NotImplementedException(); }
实现 Cancel 方法。客户端调用此方法取消现有操作。
public override void Cancel(IAsyncResult result) { //uncomment the following line to compile the project or implement the method //throw new NotImplementedException(); }
另请参阅
概念
如何:开发实例存储提供程序
如何:开发实例控制提供程序
如何:配置实例存储、查询和控制提供程序
实例存储、查询和控制提供程序
2012-03-05