2010-02-09 2 views
2

Одним из основных моментов, озвученных сообществом Alt.Net против Microsoft Entity Framework, является то, что он заставляет вас использовать базовый постоянный объект для всего, что хранится в базе данных. У меня есть два вопроса, связанные с этим:Использует корневой постоянный класс или базовый устойчивый объект запах архитектуры?

  1. Допустимо ли, чтобы иметь «Root Persistent класс» в качестве основы для объектов предметной области в приложении, или это архитектура запах?

  2. Если вы считаете, что это нормально для вас, у вас есть один в вашем приложении, это также нормально для рамки ORM, чтобы заставить вас использовать ее? Есть ли причины, чтобы избежать рамки, которая заставляет вас это делать?

Я использую абстрактный базовый объект как корень всех моих перистатических классов в течение некоторого времени. Это облегчает работу по уборке дома.

ответ

2

У меня такое ощущение, что это нормально, предполагая контекст таков, что он

  1. остается из пути
  2. не добавляет функции, которые не используются за пределами сферы действия лица
  3. не привязывает вас к какому-либо конкретному ORM (вид в соответствии с # 2)

Таким образом, если базовый класс используются для описания, например, идентификатор и значение равенства (так как много раз субъектов считаются если они имеют одинаковый идентификатор), тогда все в порядке. Однако, когда он начинает описывать информацию, ориентированную на базу данных (например, таблицы, столбцы, состояние объекта и т. Д.), Тогда да, я думаю, что он начинает пахнуть.

+0

Хорошая информация о базе данных. +1 –

+0

Это хороший способ подумать о проблеме. Я использую мой постоянный базовый класс для Ids, Equality и других домашних заданий, но они не связывают меня с какой-либо конкретной ORM или базой данных. – dthrasher

1

Если вы используете объекты передачи данных (DTO) для сохранения и использования этой модели, наличие корневого объекта для устойчивых классов в моем опыте значительно уменьшает повторение кода и повышает производительность разработчиков. И даже при использовании DTO я думаю, что это может быть полезно, хотя я редко использую DTO, поэтому не могу говорить по опыту.

я не считал бы это код запах по следующим причинам:

  1. Повышение производительности разработчиков.
  2. Консолидирует код сохранения в одном классе.
  3. Легко изменить на другую структуру, которая реализует ту же методологию (нужно только изменить наследование всех ваших бизнес-классов и обновить проверки исходного класса root).

Редактировать: Ответ на встроенный statichippo, я согласен с его мнением об этом базовом классе, включая информацию о базовых механизмах хранения данных (например, имена таблиц и столбцов, тип базы данных и т. Д.).

+0

Мне никогда не нравился подход DTO. Я получаю взрыв классов, что делает мое решение очень хрупким. Я более продуктивен с общим корнем, но хотел убедиться, что он не собирается укусить меня позже. – dthrasher

2

Для приложений с низким уровнем сложности уровень сложности с использованием базового стойкого объекта может действительно увеличить производительность разработки.

Однако выполнение этого ограничивает ваш код и ограничивает возможности дизайна, поскольку ваше приложение становится более сложным. Очевидно, что вы используете базовый класс в начале, что важно для C# и Java. Это также способствует неудовлетворительному разделению проблем.

Я бы сказал, что самое главное при рассмотрении любого ORM, чтобы задать эти вопросы (из статьи Джереми Миллера The Unit of Work Pattern and Persistence Ignorance):

  • Может бизнес-логика работает независимо от базы данных?
  • Могу ли я создать свою модель домена независимо от модели базы данных?
  • Как моя стратегия сохранения влияет на мою бизнес-логику?
+0

Я не думал о шаблоне Active Record. Мне трудно работать, когда вы начинаете заниматься дочерними объектами, внуками и т. Д. +1 Для отличной ссылки на статью о невежественности Единицы работы и Непостоянства. Это большие вопросы, чтобы спросить об решениях ORM. – dthrasher

+0

Argh, в ретроспективе это очевидно - вы говорите о функциях базового класса, таких как отслеживание грязности, поддержка версий строк, сравнение идентичности и т. Д. - не помещая фактический код доступа к данным в базовый класс! Я немного пересмотрю это, чтобы узнать, не могу ли я лучше решить этот * вопрос. –