원본 복제본에서 사용할 수 있는 데이터의 하위 집합만 대상 복제본에 필요한 경우도 있습니다. 예를 들어 정기적으로 판매하는 제품에 대해서만 자세한 제품 정보를 필요로 하는 영업 사원이 있을 수 있습니다. 단순 공급자를 사용하면 필터링 인터페이스를 구현하여 복제본에서 데이터를 필터링할 수 있습니다. 데이터를 필터링하면 다음이 가능해집니다.
네트워크를 통해 보내는 데이터 양 감소
복제본에 필요한 저장 공간 감소. 이 기능은 장치에 특히 중요합니다.
개별 복제본 요구 사항을 기반으로 하여 사용자 지정 데이터 파티션 제공
각 복제본에 대해 서로 다른 데이터 파티션을 보낼 수 있으므로 충돌 방지 또는 감소
단순 공급자는 사용자 지정 필터를 사용할 수 없으며, 그렇지 않을 경우 예상치 못한 실패가 발생할 수 있습니다. 사용자 지정 필터는 CustomFilterInfo 클래스(관리 코드의 경우) 또는 ICustomFilterInfo 인터페이스(비관리 코드의 경우)를 사용하는 필터입니다.
데이터를 필터링하려면 다음 인터페이스를 사용합니다.
관리 코드: IFilteredSimpleSyncProvider, IRequestFilteredSync 및 ISupportFilteredSync
네이티브 코드: IFilteredSimpleSyncProvider, IRequestFilteredSync 및 ISupportFilteredSync
관리 코드 예제
다음 코드 예제에서는 필터 결정 인터페이스를 사용하여 동기화 세션 중에 특정 필터를 사용해야 하는지 여부를 결정합니다. 필터 결정을 사용하면 대상 공급자가 변경 내용 열거 중에 원본 공급자가 하나 이상의 필터를 사용하도록 지정할 수 있습니다. 원본 공급자는 필터를 허용하거나 거부할 수 있습니다. 원본 공급자가 요청된 필터 중 일부를 지원하지 않으면 대상 공급자가 모든 데이터를 받고 자체적으로 필터링을 수행하도록 선택할 수 있습니다. Sync Framework는 적절하게 공급자를 호출하여 필터 사용을 결정합니다.
public bool RequestFilter
{
set
{
_requestFilter = value;
}
}
private bool _requestFilter = false;
void IRequestFilteredSync.SpecifyFilter(FilterRequestCallback filterRequest)
{
// Request a filter only if this provider represents a filtered replica.
if (_requestFilter)
{
if (!filterRequest("TheFilter", FilteringType.CurrentItemsOnly))
{
throw new SyncInvalidOperationException("Could not agree on filter.");
}
}
}
bool ISupportFilteredSync.TryAddFilter(object filter, FilteringType filteringType)
{
if (!((string)filter).Equals("TheFilter"))
{
throw new Exception("Filter is incorrect");
}
// Remember the filter.
_filter = (string)filter;
return true;
}
private string _filter = "";
Public WriteOnly Property RequestFilter() As Boolean
Set(ByVal value As Boolean)
_requestFilter = value
End Set
End Property
Private _requestFilter As Boolean = False
Private Sub SpecifyFilter(ByVal filterRequest As FilterRequestCallback) Implements IRequestFilteredSync.SpecifyFilter
' Request a filter only if this provider represents a filtered replica.
If _requestFilter Then
If Not filterRequest("TheFilter", FilteringType.CurrentItemsOnly) Then
Throw New SyncInvalidOperationException("Could not agree on filter.")
End If
End If
End Sub
Private Function TryAddFilter(ByVal filter As Object, ByVal filteringType As FilteringType) As Boolean Implements ISupportFilteredSync.TryAddFilter
If Not DirectCast(filter, String).Equals("TheFilter") Then
Throw New Exception("Filter is incorrect")
End If
' Remember the filter.
_filter = DirectCast(filter, String)
Return True
End Function
Private _filter As String = ""
다음 코드 예제에서는 우선 필터 옵션을 None으로 지정합니다. 즉, 대상에 이미 알려진 경우에도 항목을 필터링해야 합니다. 그런 다음 코드 예제에서 항목 필드 값 중 하나를 기준으로 항목을 필터링하는 IsItemInFilterScope 메서드를 구현합니다. 필터를 정의한 후 코드 예제에서 UseFilterThisSession 메서드를 구현합니다. 이렇게 하면 응용 프로그램에서 세션 단위로 필터링을 사용할지 여부를 지정할 수 있습니다.
SimpleSyncProviderFilterOptions IFilteredSimpleSyncProvider.FilterOptions
{
get
{
return SimpleSyncProviderFilterOptions.None;
}
}
bool IFilteredSimpleSyncProvider.IsItemInFilterScope(ItemFieldDictionary KeyAndVersion)
{
ulong itemId = (ulong)KeyAndVersion[1].Value;
ItemData itemData = _store.Get(itemId);
if (itemData["data"] == "3333")
{
return false;
}
return true;
}
bool IFilteredSimpleSyncProvider.UseFilterThisSession
{
get
{
// Indicate whether a filter has been requested and agreed upon for this session.
return ("" != _filter);
}
}
Private ReadOnly Property FilterOptions() As SimpleSyncProviderFilterOptions Implements IFilteredSimpleSyncProvider.FilterOptions
Get
Return SimpleSyncProviderFilterOptions.None
End Get
End Property
Private Function IsItemInFilterScope(ByVal KeyAndVersion As ItemFieldDictionary) As Boolean Implements IFilteredSimpleSyncProvider.IsItemInFilterScope
Dim itemId As ULong = KeyAndVersion(1).Value
Dim data As ItemData = _store.Get(itemId)
If data("data") Is "3333" Then
Return False
End If
Return True
End Function
Private ReadOnly Property UseFilterThisSession() As Boolean Implements IFilteredSimpleSyncProvider.UseFilterThisSession
Get
' Indicate whether a filter has been requested and agreed upon for this session.
Return "" Is _filter
End Get
End Property