이 항목에서는 관리되는 언어를 사용하여 동기화에 사용되는 필터를 협상하는 방법을 설명합니다. 두 공급자 사이의 협상을 중재하는 데 Sync Framework가 사용됩니다.
이 항목에서는 기본적인 C# 및 Microsoft .NET Framework 개념에 익숙하다고 가정합니다.
이 항목의 예제에서는 다음과 같은 Sync Framework 인터페이스 및 멤버를 중점적으로 설명합니다.
필터 협상 이해
대상 공급자는 변경 내용을 열거하는 동안 원본 공급자에서 사용되는 필터를 지정할 수 있습니다. 원본 공급자는 대상 공급자가 요청하는 필터를 허용하거나 거부할 수 있습니다. 대상 공급자는 원본 공급자가 허용하는 필터를 찾을 때까지 계속 필터를 요청할 수 있습니다. 이 협상은 Sync Framework에서 조정됩니다. 필터는 공급자에 가장 적합한 어떤 형식이든 될 수 있습니다.
Sync Framework는 BeginSession을 호출한 후 필터 협상을 시작합니다. 대상 공급자가 IRequestFilteredSync를 구현하는 경우 Sync Framework는 해당 SpecifyFilter 메서드를 호출합니다. 이 메서드에서 대상 공급자는 허용되는 필터가 있을 때까지 FilterRequestCallback 대리자에 필터를 전달합니다. 이 대리자는 자신의 TryAddFilter 메서드를 호출하여 필터를 원본 공급자에 전달합니다. 이 메서드에서 원본 공급자는 요청된 필터를 허용하거나 거부합니다. 원본 공급자는 필터를 허용한 경우 해당 필터를 사용하여 필터를 통과한 항목이나 변경 단위만 포함하는 필터링된 변경 내용 일괄 처리를 생성해야 합니다.
빌드 요구 사항
.NET Framework 2.0 이상
Microsoft.Synchronization에 대한 참조
예제
이 항목의 예제 코드에서는 필터를 추적하는 두 공급자 간에서 사용자 지정 필터를 협상하는 방법을 보여 줍니다.
필터 요청
대상 공급자가 IRequestFilteredSync를 구현하므로, Sync Framework에서는 해당 SpecifyFilter 메서드를 호출합니다. 이 메서드에서 대상 공급자는 FilterRequestCallback 대리자를 통해 추적된 필터 목록의 첫 번째 필터를 원본 공급자가 필터링된 변경 내용 일괄 처리를 생성하는 데 사용하도록 요청합니다. 대상 공급자는 이 필터를 추적하므로 CurrentItemsAndVersionsForMovedOutItems의 필터 유형을 지정합니다. 원본 공급자가 필터를 거부한 경우 대상 공급자는 SyncInvalidOperationException을 발생시켜 상호 합의된 필터가 없으며 원본 공급자와 동기화할 수 없음을 나타냅니다.
public void SpecifyFilter(FilterRequestCallback filterRequest)
{
// Use the first tracked filter as the filter for sync.
if (0 < _ContactStore.TrackedFilters.Count)
{
_filterForSync = _ContactStore.TrackedFilters[0];
}
// The source provider must agree to send a filtered change batch.
if (!filterRequest(_filterForSync, FilteringType.CurrentItemsAndVersionsForMovedOutItems))
{
throw new SyncInvalidOperationException("Filter specified by SpecifyFilter was rejected.");
}
}
필터 허용
원본 공급자가 ISupportFilteredSync를 구현하므로, Sync Framework에서는 대상 공급자가 FilterRequestCallback 대리자를 호출할 때마다 한 번씩 TryAddFilter 메서드를 호출합니다. 이 메서드에서 원본 공급자는 추적된 필터 목록을 열거하고 요청된 필터와 동일한 필터가 있는 경우 해당 필터를 허용합니다.
public bool TryAddFilter(object filter, FilteringType filteringType)
{
_filterForSync = null;
// The filter must be tracked by both replicas.
for (int filterKey = 0; filterKey < _filterKeyMap.Count; filterKey++)
{
if (_filterKeyMap[filterKey].IsIdentical((ISyncFilter)filter))
{
_filterForSync = (AddressFilter)_filterKeyMap[filterKey];
_filteringType = filteringType;
break;
}
}
return (null != _filterForSync);
}
다음 단계
다음으로, Sync Framework에서 사용할 수 있는 항목 필터, 변경 단위 필터, 사용자 지정 필터 같은 다양한 필터 사용 방법에 대해 알아볼 수 있습니다. 필터링에 대한 자세한 내용은 동기화 데이터 필터링을 참조하십시오.