Я проектирую небольшой механизм синхронизации каталогов, который может принимать различные виды источников и обрабатывать добавочную синхронизацию. Я определил интерфейс для DirectorySource, который в настоящее время выглядит следующим образом:
public interface IDirectorySource
{
IEnumerable<IDirectoryEntry> GetChanges(IList<string> attributes, IChangeToken token);
}
Я хочу предоставить перечислитель вместо списка, чтобы избежать ненужного выделения памяти, но моя проблема в том, что я также хочу вернуть новый IChangeToken, который содержит новую информацию о состоянии, необходимую для следующего вызова GetChanges (делать инкрементные обновления). Код изменения должен быть рассчитан после перечисление завершено, поскольку кто-то другой мог обновлять каталог между различными вызовами.
Я думал о том, чтобы иметь второй параметр IChangeToken, который получает новый токен, но это не очень приятно (и не будет согласованным, так как токен будет возвращен немедленно, но не может быть заполнен, пока не завершится перечисление). ) .. И я думал о возврате чего-то вроде «IChangeSet» -интерфейса, который содержит метод GetEnumerator и метод GetToken, но проблема все еще в том, что последующие вызовы метода перечислителя возвращают разные данные (и, следовательно, имеют разные changetokens ).
Как я могу спроектировать интерфейс, который делает невозможным для пользователя моего интерфейса неправильное использование его в отношении моего перечислителя GetChanges и получения соответствующего ChangeToken?
Надеюсь, мой вопрос имеет смысл ...;) .. Мне было трудно понять, какой заголовок использовать для моего вопроса ...;)