Действительно ли возможно использовать NHibernate, не изменяя модель DDD, которая является частью платформы

Остерегайтесь цветовых сдвигов при использовании PNG. Эта ссылка дает пример и содержит намного больше ссылок с дальнейшим объяснением:

http://www.hanselman.com/blog/GammaCorrectionAndColorCorrectionPNGIsStillTooHard.aspx

изображения GIF не подвергаются этой проблеме.

15
задан Community 23 May 2017 в 11:45
поделиться

3 ответа

Краткий ответ на ваш вопрос в том, что это невозможно, но если нет необходимости в ленивой загрузке, необходимые изменения тривиальны.

В любом случае, вам придется добавлять конструкторы по умолчанию к классам, у которых их еще нет. Если вы готовы отказаться от отложенной загрузки, эти конструкторы по умолчанию могут быть закрытыми, и вам не нужно вносить никаких других изменений в модель вашей предметной области, чтобы использовать NHibernate.

Это ужасно близко к игнорированию настойчивости. 1270]. При этом, если вы хотите отложить загрузку, вам нужно будет внести несколько изменений (изложенных в других ответах на этот вопрос), чтобы NHibernate мог создавать прокси ваших агрегированных сущностей. Я' m лично все еще пытается решить, является ли отложенная загрузка технологией, обеспечивающей DDD, или это преждевременная оптимизация, требующая слишком большого количества навязчивых изменений в моих POCO. Я склоняюсь к первому, хотя мне бы очень хотелось, чтобы NHibernate можно было настроить для использования определенных конструкторов.

Вы также можете взглянуть на блог Дэви Бриона (мне особенно понравился Реализация объекта значения с NHibernate ]), что действительно полезно, если вы интересуетесь дизайном, ориентированным на предметную область, и избегаете анемичных моделей предметной области.

Вы также можете взглянуть на блог Дэви Бриона (мне особенно понравился Реализация объекта значения с NHibernate ), который действительно проливает свет, если вы интересуетесь дизайном на основе предметной области и избегаете анемичной области модели.

Вы также можете взглянуть на блог Дэви Бриона (мне особенно понравился Реализация объекта значения с NHibernate ), который действительно проливает свет, если вы интересуетесь дизайном на основе предметной области и избегаете анемичной области модели.

4
ответ дан 1 December 2019 в 04:09
поделиться
  • Для NHibernate:
    • All mapped classes require a default (no-arguments) constructor. The default constructor does not have to be public (it can be private so that it is not a part of the API), but it must exist. This is because NHibernate must be able to create an instance of the mapped class without passing any arguments. (There are workarounds, but don't do that.)
    • All mapped properties for which lazy-loading will be required must be marked virtual. This includes all reference properties and all collection properties. This is because NHibernate must be able to generate a proxy class deriving the mapped class and overriding the mapped property.
    • All mapped collection properties should use an interface as the property type. For example, use IList rather than List. This is because the collections types in the .NET Framework tend to be sealed, and NHibernate must be able to replace a default instance of the collection type with its own instance of the collection type, and NHibernate has its own internal implementations of the collection types.
    • For NHibernate, prefer Iesi.Collections.Generic.ISet to System.Collections.Generic.IList, unless you are sure that what you want is actually a list rather than a set. This requires being conversant in the theoretical definitions of list and set and in what your domain model requires. Use a list when you know that the elements must be in some specific order.

Also note that it's typically not easy to swap object-relational mapping frameworks, and in many cases it is impossible, when you have anything beyond a trivial domain model.

9
ответ дан 1 December 2019 в 04:09
поделиться

По моему опыту, единственное, что NHibernate требует от домена, - это виртуальные свойства и методы, а также конструктор по умолчанию без аргументов, который, как сказал Джефф, может быть помечен как частный или защищенный, если это необходимо. Вот и все. NHibernate - мой выбор OR / M, и я считаю, что весь стек NHibernate (NHibernate, NHibernate Validator, Fluent NHibernate, LINQ to NHibernate) является наиболее убедительной структурой для сохранения доменов POCO.

Несколько вещей, которые вы можете сделать с помощью NHibernate:

  • Украсьте модель своей предметной области атрибутами NHV. Эти константы позволяют делать три вещи: проверьте свои объекты, убедитесь, что недопустимые сущности не сохраняются через NHibernate, и помогите автоматически сгенерировать вашу схему при использовании инструментов NHibernate SchemaExport или SchemaUpdate.
  • Сопоставьте модель вашей предметной области с вашим постоянным хранилищем с помощью Fluent NHibernate. Для меня основным преимуществом использования FNH является возможность автоматически отображать ваши объекты на основе установленных вами соглашений. Кроме того, вы можете при необходимости переопределить эти автоматические приложения, вручную написать карты классов, чтобы получить полный контроль над сопоставлениями, и при необходимости использовать файлы xml hbm.
  • После того, как вы купите использование NH, вы можете легко использовать SchemaExport или Инструменты SchemaUpdate для создания и выполнения DDL для вашей базы данных, позволяющие автоматически переносить изменения домена в вашу базу данных при инициализации фабрики сеансов NH. Это позволяет забыть о базе данных, для всех намерений и целей и вместо этого сконцентрируйтесь на своем домене. Обратите внимание, что во многих случаях это может быть бесполезным или идеальным, но для быстрой локальной разработки приложений, ориентированных на домен, я считаю это удобным.
  • Кроме того, мне нравится использовать общие репозитории для обработки сценариев CRUD. Например, у меня обычно есть IRepository, который определяет методы для получения всех объектов в виде IQueryable, отдельного объекта по идентификатору, для сохранения объекта и для удаления объекта. Для всего остального NH предлагает богатый набор механизмов запросов - вы можете использовать LINQ to NHibernate, HQL, запросы критериев и прямой SQL, если это необходимо.

Единственный компромисс, который вам нужно сделать, - это использовать атрибуты NHV в вашем домене. . Для меня это не препятствие, поскольку NHV - это автономный фреймворк, который добавляет дополнительные возможности, если вы решите использовать NHibernate.

Я создал несколько приложений с использованием NH, и у каждого из них есть домен, игнорирующий персистентность, со всеми проблемами персистентности, разделенными на его собственную сборку. Это означает, что одна сборка предназначена для вашего домена, а другая - для ваших быстрых сопоставлений, управления сеансами и интеграции проверки. Он очень красивый, чистый и хорошо справляется со своей работой.

Между прочим: у вас чертовски хороший английский, я бы хотел, чтобы мой французский был на должном уровне ;-).

4
ответ дан 1 December 2019 в 04:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: