Я написал систему управления версиями для нашего приложения. Я разделил версионный объект на два класса: один представляет весь объект, а второй - его версии.
В нашем программном обеспечении управление версиями является частью бизнес-логики. Приложение предоставляет доступ к истории, и пользователь имеет некоторый контроль над версиями.
Поэтому в памяти создается новая версия. Вам нужно выполнить глубокую копию. Вы можете реализовать это, внедрив интерфейс в корневую сущность и все ее дочерние элементы. Этот интерфейс предоставляет метод DeepCopy
, который рекурсивно вызывается через граф объектов.
Существует также защищенный метод MemberwiseCopy
в object
, который может быть полезен. Это не глубокая копия.
Мы не хотели, чтобы боль поддерживала код, который копирует каждое отдельное свойство. Поэтому мы используем сериализацию для копирования графа объектов в память:
public static T CopyDataContract<T>(T obj)
{
NetDataContractSerializer serializer = new NetDataContractSerializer();
using (MemoryStream stream = new MemoryStream())
{
serializer.Serialize(stream, obj);
stream.Position = 0;
return (T)serializer.Deserialize(stream);
}
}
Кроме того, у нас есть методы в сущностях, которые сбрасывают идентификаторы и выполняют другую очистку. Это также делается рекурсивно через граф объектов.
Пока все работает нормально. В будущем нам, вероятно, потребуется реорганизовать его в реализацию интерфейса, что немного чище.