Для отслеживания ревизий класса Page
у меня есть класс PageRevision
, который наследуется от Page
и добавляет идентификатор ревизии (Guid RevisionID;
).
Если возможно, как я должен кастоватьсуществующий объект Page
в PageRevision
и убедиться, что конструктор PageRevision вызывается для создания нового идентификатора ревизии?
Я мог бы иметь конструктор PageRevision(Page page)
, который генерирует Guid и копирует все страницы.атрибутов, но я хочу автоматизировать его, особенно если класс Page
имеет много атрибутов (а позже я добавлю один и забуду изменить конструктор копирования).
Желаемое использование
Page page = new Page(123, "Page Title", "Page Body"); // where 123 is page ID
PageRevision revision = (PageRevision)page;
// now revision.RevisionID should be a new Guid.
Page
, PageRevision
классы:
public class Page
{
public int ID { get; set; }
public string Title { get; set; }
public string Body { get; set; }
}
public class PageRevision : Page
{
public Guid RevisionID { get; set; }
public PageRevision()
{
this.RevisionID = Guid.NewGuid();
}
}
Редактирование на основе обратной связи:
Помимо очевидной на сегодня проблемы с кастингом (Horse)Animal;
, Джон Скит рекомендует составную версию:
public class PageRevision : Page
{
private readonly Page page;
private readonly Guid id;
public Guid RevisionID { get { return id; } }
public Page Page { get { return page; } }
public PageRevision(Page page)
{
this.id = Guid.NewGuid();
this.page = page;
}
}
Тем не менее, это сильно отличается от моей модели данных, и я хотел бы, чтобы эти две модели были максимально похожими.В моей базе данных таблица PageRevisions
имеет те же столбцы, что и таблица Pages
, за исключением дополнительного столбца RevisionID
.Это просто для версии с триггером базы данных.
- В свете этого комбинированного подхода, имеет ли смысл иметь
PageRevisions
для хранения всех данных страницы: a RevisionID
, Title
и Body
, тогда как в таблице Pages
хранятся только URL Slug
и RevisionID
, которые относятся к таблице PageRevisions
?