В чем разница между объектами домена, POCOs и сущностями?
У меня сложилось впечатление, что все они в основном одинаковы. Являются ли объекты модели одинаковыми?
Сейчас, в моей архитектуре, я:
class Person
{
public string PersonId;
public string Name;
public string Email;
public static bool IsValidName() { /* logic here */ }
public static bool IsValidEmail() { /* logic here */ }
}
class PersonService
{
private PersonRepository pRepository;
PersonService()
{
pRepository = new PersonRepository();
}
public bool IsExistingEmail(string email)
{
//calls repo method to see if email is in db
}
public Person GetPerson(email)
{
return pRepository.Get(email);
}
public void SavePerson(Person p)
{
if (Person.IsValidEmail(p.Email) && !IsExistingEmail(p.Email)
{
pRepository.Save(p);
}
}
}
class PersonRepository
{
public void Save(Person p)
{
//save to db
}
public Person Get(string email)
{
//get from db
}
public bool IsExistingEmail(string email)
{
//see if email in db
}
}
Итак, какой из перечисленных классов POCO
, Domain Object
, Model object
, entity
?
Ответы
Ответ 1
Мои (нестандартные) определения Layman
-
POCO
- Обычный Старый% Insert_Your_Language% Объект. Тип, в котором нет логики. Он просто хранит данные в памяти. Обычно вы видите в нем только свойства auto, иногда поля и конструкторы.
-
Domain object
экземпляр класса, связанного с вашим доменом. Я бы, вероятно, исключил любые объекты спутников или служебных объектов из объекта домена, например. в большинстве случаев объекты домена не включают такие вещи, как ведение журнала, форматирование, сериализация, шифрование и т.д. - если вы специально не создаете продукт для регистрации, сериализации, форматирования или шифрования соответственно.
-
Model object
Я думаю, что это то же самое, что Domain object
. Люди склонны использовать это взаимозаменяемо (я могу ошибаться)
-
Entity
класс, который имеет id
-
Repository
класс, который говорит с хранилищем данных с одной стороны (например, с базой данных, службой данных или ORM) и с сервисом, пользовательским интерфейсом, бизнес-уровнем или любым другим запрашивающим органом. Он обычно скрывает все данные, связанные с данными (например, репликация, объединение пулов, ограничения ключей, транзакции и т.д.) И упрощает работу с данными
-
Service
программное обеспечение, которое обеспечивает некоторую функциональность, как правило, через открытый API. В зависимости от уровня это может быть, например, автономный контейнер RESTful или класс, который позволяет вам найти конкретный экземпляр требуемого типа.
Оригинальный ответ
Это terms, которые в основном используются в (распределенном) проекте Driven Driven Design. Они не одинаковы. Термин model Object может использоваться как синоним объекта домена.
Объекты домена. Объекты из области бизнеса, которые представляют что-то значимое для эксперта домена. Объекты домена в основном представлены объектами и объектами ценности. Говоря об общем языке, большинство объектов, которые живут в доменном слое, вносят вклад в модель и являются объектами домена.
Entity. Объект, фундаментально определяемый не его атрибутами, а потоком непрерывности и идентичности. (Значение должно иметь Id)
POCO. Простой объект без сложной логики, который не требует идентификации, обычно он имеет всего несколько свойств и используется с ORM или как объект передачи данных
class Person
- Entity и POCO, экземпляр этого класса - Object Object
class PersonService
- Сервис
class PersonRepository
- Репозиторий
Ответ 2
Это скорее коннотация функции; объект домена является чем-то специфичным для вашей логической реализации и может быть более сложным, чем простой POCO; сущность имеет коннотацию, чтобы представлять что-либо (обычно в отношении носителя постоянства), а POCO - просто быстрый идентификатор для класса. Модель - это просто термин, используемый для представления объекта (обычно содержащего состояние и обычно имеющего дело с пользовательским интерфейсом или БД).
Это не то, что есть какая-то функциональная разница, они просто разные термины, чтобы более точно описать что-то. Как разница между гоночным автомобилем, грузовиком и семейным седаном. Все автомобили, но каждый термин более описателен.
Ответ 3
в основном это сводится к внутренней логике
- Объекты домена имеют внутренние логические вещи домена, такие как проверка и т.д.
- Модель - это в основном легкий объект Domain, они знают о данных, которые они хранят, но ничего не знают о том, как это будет использоваться
- Объекты хранят данные и имеют некоторые внутренние знания о том, откуда они пришли, и где они собираются сохранять, обновлять и т.д.
- POCO хранит данные и может иметь некоторые внутренние знания об этом, такие вещи, как то, что является общей стоимостью всех элементов в коллекции свойств.
- DTO - самый простой элемент для всех, он просто хранит данные и не имеет логики
Все они в основном используются для одной и той же вещи, это просто, насколько вы умны, чтобы они были
в соответствии с вашим примером кода
Класс Person будет объектом домена или моделью, остальные 2 - службой и репозиторием. Объекты домена, Pocos, модели, dtos и т.д. Используются как сообщения, передаваемые от одного уровня к другому, класс обслуживания, такой как PersonService, является слоем в приложении и тем же самым с классом репозитория, как PersonRepository. для хорошего просмотра взгляните на http://bob-the-janitor.blogspot.com/2009/07/n-tier-design-revisit-part-1-over-view.html, в этом случае он говорит об использовании объекта данных, который в основном является dto
Ответ 4
В ответах выше уже есть хорошие объяснения Домена и Модели.
В объекте "Контекст базы данных" означает "Элемент" в "Модель отношения сущностей ERD" . (т.е. строка в таблице)
В Microsoft-Dotnet-EntityFramework-World Entity означает объект, который может быть загружен из базы данных и сохранен в базе данных с использованием контекста Data (Base). Обычно Сущность не может существовать без Контекста данных (Базы). (Unit-) Тестирование бизнес-функциональности этих классов затруднено.
Pocos (Обычные старые объекты CommonRuntime) могут существовать без PersistenceFramework (EntityFramework или NHibernate), поэтому их гораздо легче проверить.
Слово poco - это адаптация pojo (простой старый Java-объект), который был создан в мире Java по той же причине.
Ответ 5
Просто подсказка дизайна.
Вместо использования:
class PersonService
{
private PersonRepository pRepository;
PersonService()
{
pRepository = new PersonRepository();
}
}
Использование:
class PersonService
{
private PersonRepository pRepository;
PersonService(PersonRepository pRepository)
{
this.pRepository = pRepository;
}
}
Чтобы обеспечить инъекцию зависимостей в PersonService.
Ответ 6
Объект домена является объектом на уровне домена вашего приложения, например. класс адреса. "Модель" означает одно и то же - объект в "Модель домена".
POCO (простой старый объект CLR) - это объект, который не имеет определенного поведения (методов) и содержит только данные (свойства). POCO обычно используются как DTO (объекты передачи данных) для переноса данных между уровнями, а затем данные обычно используются для заполнения объекта/объекта домена.