Неспособность сохранения обычно определяется как способность сохранять и извлекать стандартные объекты .NET(или POCOs, если вы действительно настаиваете на предоставлении им имени). И казалось бы, хорошо принятое определение стандартного объекта .NET:
"... обычные классы, где вы сосредоточены на проблемах бизнеса, не добавляя вещи по причинам, связанным с инфраструктурой..."
Тем не менее, я вижу, что люди, описывающие NHibernate как структуру, которая допускает незнание невежества, и тем не менее это структура, которая не может работать на каком-либо стандартном объекте .NET, только стандартные объекты .NET, которые придерживаются определенных требований к дизайну, например (источник):
- Все классы должны иметь конструктор по умолчанию
- Некоторые функции не работают, если классы не распечатаны, а все участники виртуальны.
- Идентификация объекта не работает должным образом, если вы не злоупотребляете Equals/GetHashCode
(Кроме того: прежде чем кто-либо расстраивается, я не собираюсь выбирать NHibernate здесь, это просто часто цитируемый пример структуры, которая предположительно допускает незнание незнания. Я уверен, что аналогичные аргументы могут быть применены к другим ORM, которые заявите то же самое.)
Теперь, хотя класс сам по себе не имеет каких-либо атрибутов или базовых классов, связанных с сохранением структуры, для меня это на самом деле не "ненасытность настойчивости", поскольку он должен следовать набору руководящих принципов проектирования, чтобы облегчить использование выбранными персистентность. Вы должны проектировать и внедрять класс с учетом требований постоянной структуры; если вы не знаете об этом, класс может не работать с ним.
В тех случаях, когда у меня возникают проблемы с определением "persistence ignorance" / "POCO", я не вижу, как это принципиально отличается от добавления атрибутов, таких как [Serializable]
или [DataContract]
или [XmlType]
или любые другие аннотации, связанные с сохранением структуры, которые облегчают сохранение и извлечение объекта, использующего эту инфраструктуру.
Итак, что же такое "постоянство невежества"?
Ясно, что определение его как способного сохранять "обычные классы" является ошибкой, потому что NHibernate являются только обычными, поскольку не ссылаются на классы, специфичные для каркаса, тогда как они необычайны, поскольку они требуют необычных вариантов дизайна, таких как дефолт конструкторы и все виртуальные элементы и реализации Equals/GetHashCode на изменяемых типах.
Поэтому разумно ли говорить, что "незнание персистентности" истинно, когда объекты облегчают использование структуры персистентности (либо в дизайне и структуре, либо с использованием аннотаций, специфичных для структуры), но сами не выполняют никакой логики сохранения?