다음을 통해 공유


방법: 열거된 항목 필터링

이 항목에서는 사용자 지정 데이터 저장소의 데이터를 동기화하는 Sync Framework 동기화 공급자에 의해 열거된 항목을 관리되는 언어를 사용하여 필터링하는 방법을 설명합니다.

이 항목에서는 기본적인 C# 및 Microsoft .NET Framework 개념에 익숙하다고 가정합니다.

이 항목의 예제에서는 다음과 같은 Sync Framework 클래스 및 멤버를 중점적으로 설명합니다.

항목 필터링 이해

항목 필터는 원본 공급자가 변경 내용을 열거하는 동안 보내는 항목 변경 내용을 제한합니다. 예를 들어 파일 폴더에서 다른 형식의 파일을 무시하고 .txt 파일만 보내도록 제한할 수 있습니다. 기존 항목을 필터 내부나 외부로 이동하는 방식으로 항목이 변경되어서는 안 됩니다. 항목 필터는 간편하게 사용할 수 있지만 동기화 범위에 포함되는 항목 수에 비례하여 동기화에 사용되는 메타데이터가 증가합니다. 저장소가 문제가 되는 경우에는 사용자 지정 필터를 사용하는 것이 좋습니다. 사용자 지정 필터링에 대한 자세한 내용은 동기화 데이터 필터링을 참조하십시오.

항목이 필터링되는 방식은 Sync Framework 외부에서 대개 공급자 개발자 또는 타사에 의해 정의됩니다. 이 필터는 응용 프로그램과 공급자 간에 적절한 모든 메커니즘을 사용하여 동기화 응용 프로그램에서 설정하거나 두 공급자 간에서 협상될 수 있습니다. 필터 협상에 대한 자세한 내용은 동기화 데이터 필터링을 참조하십시오.

대상 공급자는 표준 변경 내용 일괄 처리의 경우와 동일한 방식으로 변경 내용을 받고 적용합니다. 필터링을 처리하기 위한 특별한 동작은 필요하지 않습니다.

빌드 요구 사항

예제

이 항목의 예제 코드에서는 간단한 항목 필터를 구현하는 방법 및 Metadata Storage Service를 사용하여 필터링된 변경 내용 일괄 처리를 생성하는 방법을 보여 줍니다. 이 예제의 복제본은 연락처 정보를 쉼표로 구분된 값의 목록으로 저장하는 텍스트 파일입니다. 동기화할 항목은 이 파일에 포함된 연락처입니다. 응용 프로그램에 지정된 값보다 생년월일 필드의 값이 작은 연락처만 포함하도록 필터가 정의되었습니다.

필터 설정

원본 공급자는 응용 프로그램에서 생년월일 필드의 최대값을 정의하는 필터를 설정하는 데 사용할 수 있는 공용 메서드를 구현합니다. 생년월일 필드의 값이 이 값보다 큰 모든 연락처는 변경 내용 일괄 처리에 포함되지 않습니다.

public void SetMaximumBirthdateFilter(DateTime maxBirthdateFilter)
{
    // Store the fact that a filter is set, and the value of the filter.
    _isFiltered = true;
    _maxBirthdateFilter = maxBirthdateFilter;
}

동기화 응용 프로그램은 원본 공급자를 로컬 공급자로 만들고 SetMaximumBirthdateFilter 메서드를 사용하여 변경 내용을 열거할 때 포함할 생년월일 최대값을 지정합니다. 또한, 이 응용 프로그램은 대상 공급자를 만들고 동기화를 수행합니다.

private void SynchronizeWithItemFiltering(ContactStore localStore, ContactStore remoteStore, SyncDirectionOrder syncDir)
{
    // Create the local provider and set the item filter.
    // The filter is ignored when the provider is the destination provider.
    SyncProvider localProvider = new ContactsProviderItemFiltering(localStore);
    // Only include contacts with a birthdate before January 1, 2000.
    ((ContactsProviderItemFiltering)localProvider).SetMaximumBirthdateFilter(
        new DateTime(2000, 1, 1));

    // Create the remote provider and do not set a filter.
    SyncProvider remoteProvider = new ContactsProviderItemFiltering(remoteStore);

    // Create the synchronization orchestrator and set the providers and synchronization direction.
    SyncOrchestrator orchestrator = new SyncOrchestrator();
    orchestrator.LocalProvider = localProvider;
    orchestrator.RemoteProvider = remoteProvider;
    orchestrator.Direction = syncDir;

    string msg;
    try
    {
        // Synchronize data between the two providers.
        SyncOperationStatistics stats = orchestrator.Synchronize();

        // Display statistics for the synchronization operation.
        msg = "Synchronization succeeded!\n\n" +
            stats.DownloadChangesApplied + " download changes applied\n" +
            stats.DownloadChangesFailed + " download changes failed\n" +
            stats.UploadChangesApplied + " upload changes applied\n" +
            stats.UploadChangesFailed + " upload changes failed";
    }
    catch (Exception ex)
    {
        msg = "Synchronization failed! Here's why: \n\n" + ex.Message;
    }
    MessageBox.Show(msg, "Synchronization Results");
}

필터링된 변경 내용 일괄 처리 열거

원본 공급자는 GetChangeBatch를 구현하므로, 필터가 지정된 경우 Metadata Storage Service를 사용하여 필터링된 변경 내용 일괄 처리를 생성합니다. 이 작업은 ItemListFilterInfo 개체를 만든 다음 이를 ReplicaMetadata 개체의 GetFilteredChangeBatch 메서드로 전달하여 수행됩니다.

public override ChangeBatch GetChangeBatch(uint batchSize, SyncKnowledge destinationKnowledge, out object changeDataRetriever)
{
    // Return this object as the IChangeDataRetriever object that is called to retrieve item data.
    changeDataRetriever = this;

    // Use the metadata storage service to get a batch of changes.
    ChangeBatch retrievedBatch;
    if (_isFiltered)
    {
        // If a filter is set, get a filtered change batch from the metadata storage service.
        // The BirthdateFilterCallback method indicates whether an item passes the filter.
        ItemListFilterInfo filterInfo = new ItemListFilterInfo(IdFormats);
        retrievedBatch = _ContactStore.ContactReplicaMetadata.GetFilteredChangeBatch(batchSize, destinationKnowledge,
            filterInfo, BirthdateFilterCallback);
    }
    else
    {
        retrievedBatch = _ContactStore.ContactReplicaMetadata.GetChangeBatch(batchSize, destinationKnowledge);
    }

    return retrievedBatch;
}

항목이 필터에 포함되는지 결정하기 위해 GetFilteredChangeBatch 메서드는 원본 공급자가 구현하는 ItemFilterCallback 대리자를 사용합니다. Metadata Storage Service는 이 대리자를 호출하고 반환 값을 사용하여 항목을 변경 내용 일괄 처리에 포함하거나 제외합니다. 이 예제에서 항목은 생년월일 필드의 값이 지정된 생년월일 최대값보다 작은 경우에 변경 내용 일괄 처리에 포함됩니다.

public bool BirthdateFilterCallback(ItemMetadata itemMeta)
{
    // An item passes the filter only if its birthdate field is less than the maximum birthdate
    // specified by the filter.
    return (_ContactStore.ContactList[itemMeta.GlobalId].Birthdate < _maxBirthdateFilter);
}

다음 단계

다음으로, 공급자가 대상 공급자와 통신하여 변경 내용 열거에 사용할 필터를 설정할 수 있도록 필터 협상 기능을 추가할 수 있습니다. 필터를 협상하는 방법에 대한 자세한 내용은 방법: 필터 협상을 참조하십시오.

항목 필터 대신 사용자 지정 필터를 사용할 수도 있습니다. 사용자 지정 필터는 구현하기가 더 힘들지만 훨씬 더 효율적으로 추적하고 통신할 수 있으므로 사용자 지정 필터를 사용하면 동기화 메타데이터의 크기를 작게 유지할 수 있습니다. 사용자 지정 필터에 대한 자세한 내용은 동기화 데이터 필터링을 참조하십시오.

참고 항목

개념

일반적인 표준 사용자 지정 공급자 태스크 프로그래밍
동기화 데이터 필터링