# Поддержка исторических данных

Одной из отличительных особенностей формата является поддержка исторических данных — хронологии изменения публичных свойств пользовательского класса — бизнес-объекта. Это позволяет получить значение свойства на конкретный момент времени.

Для того, чтобы класс бизнес-объекта поддерживал работу с историческими данными он должен реализовывать интерфейс XyloCode.BusinessData.IBusinessObject:

public interface IBusinessObject
{
    IDictionary<string, byte[]> BusinessObjectData { get; set; }
}

Например:

[BusinessObjectId(3)]
public class Person : IBusinessObject
{
    IDictionary<string, byte[]> IBusinessObject.BusinessObjectData { get; set; }

    [TagId(1)]
    public int Id { get; set; }

    [TagId(2)]
    public string Surname { get; set; }
 
    [TagId(3)]
    public string Name { get; set; }
}

# Автоматическая фиксация изменений

Для режима "сериализация - десериализация - правка - сериализация" возможна автоматическая фиксация изменений при работе с бизнес-объектом, она активируется свойством HistoricalCapture бинарного сериализатора:

var serializer = new XyloCode.BusinessData.Serializer();
serializer.HistoricalCapture = true;

# Работа с историческими объектами

Исторический объект (класс XyloCode.BusinessData.HistoricalObject) — специальный инструмент для работы с историческими данными бизнес-объекта, он позволяет устанавливать, редактировать и получать значения свойств на определенный момент времени.

var serializer = new XyloCode.BusinessData.Serializer();

var person = new Person {
    Id = 1,
    Surname = "Ciccone",
    Name = "Madonna"
};

var histObj = new XyloCode.BusinessData.HistoricalObject<Person>(serializer, person);
histObj.SetAfter<string>("Surname", new DateTime(1985, 8, 16), "Penn");
histObj.SetAfter<string>("Surname", new DateTime(2000, 12, 22), "Ritchie");
histObj.Save();

var now = histObj.Get<string>("Surname");
Console.WriteLine(now);
> Ritchie

Основные методы, используемые при работе с историческими объектами:

  • Load() — загрузка словаря BusinessObjectData и хранилищ исторических значений;
  • Refresh() — актуализация словаря BusinessObjectData в соответствии с данными хранилищ исторических значений;
  • Update() — актуализация словаря BusinessObjectData текущими значениями свойств экземпляра класса бизнес-объекта;
  • Get() — получение значения свойства бизнес-объекта на конкретную дату и время;
  • Set() — установка текущего значения свойства бизнес-объекта;
  • SetAfter() — установка исторического значения свойства бизнес-объекта, которое должно начать действовать с указанной даты;
  • SetBefore() — установка исторического значения свойства бизнес-объекта, которое должно действовать до указанной даты;
  • RemoveOnDate() — удаление исторического значения свойства бизнес-объекта, которое действует на указанную дату;
  • RemoveFromPastBefore() — удалить все исторические значения свойства бизнес-объекта, действовавшие до указанной даты и время действия которых прошло;
  • RemoveFromPastAfter() — удалить все исторические значения свойства бизнес-объекта, которые действовали с указанной даты и время действия которых прошло;
  • RemoveFromFutureBefore() — удалить все исторические значения свойства бизнес-объекта, которые должны действовать до указанной даты и время действия которых ещё не наступило;
  • RemoveFromFutureAfter() — удалить все исторические значения свойства бизнес-объекта, которые должны действовать с указанной даты и время действия которых ещё не наступило;
  • Save() — сохранение изменений в хранилище исторических значений.