방법: 인스턴스 쿼리 공급자 개발
다음 절차에서는 사용자 지정 인스턴스 쿼리 공급자를 만들기 위한 단계를 제공합니다.
클래스 라이브러리 프로젝트를 만듭니다.
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;
InstanceQueryProvider 클래스에서 파생되는 인스턴스 쿼리 공급자에 대한 클래스를 만듭니다.
public sealed class MySqlInstanceQueryProvider : InstanceQueryProvider { }
Initialize 메서드를 구현합니다. 이 메서드는 구성 파일에 지정된 구성 정보에 해당하는 속성 모음을 적용합니다. 이 속성 모음의 데이터는 공급자를 구성하는 데 사용됩니다. CreateInstanceQuery 또는 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(); }
참고 항목
개념
방법: 인스턴스 저장소 공급자 개발
방법: 인스턴스 컨트롤 공급자 개발
방법: 인스턴스 저장소, 쿼리 및 컨트롤 공급자 구성
인스턴스 저장소, 쿼리 및 제어 공급자
2011-12-05