В чем разница между объектами домена, POCO и объектами? - PullRequest
69 голосов
/ 27 мая 2011

У меня сложилось впечатление, что все они в основном одинаковы. Объекты модели также одинаковы?

Прямо сейчас, в моей архитектуре, у меня есть:

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?

Ответы [ 6 ]

89 голосов
/ 27 мая 2011

Мои (нестандартные) определения Layman

  • POCO - Обычный старый% Insert_Your_Language% Object.Тип без логики.Он просто хранит данные в памяти.Обычно вы видите только автоматические свойства, иногда поля и конструкторы.
  • Domain object экземпляр класса, который связан с вашим доменом.Я бы, вероятно, исключил любые объекты-спутники или служебные объекты из объекта домена, например, в большинстве случаев объекты домена не включают такие вещи, как ведение журнала, форматирование, сериализация, шифрование и т. Д., Если вы специально не создаете продукт для регистрации, сериализации, форматирования или шифрования соответственно..
  • Model object Я думаю, что то же самое, что и Domain object.Люди склонны использовать это взаимозаменяемо (я могу ошибаться)
  • Entity класс, который имеет id
  • Repository класс, который говорит с хранилищем данных с одной стороны (например,база данных, служба данных или ORM) и в службу, пользовательский интерфейс, бизнес-уровень или любой другой запрашивающий орган.Обычно он скрывает все связанные с данными вещи (такие как репликация, пул соединений, ключевые ограничения, транзакции и т. Д.) И упрощает работу только с программным обеспечением для обработки данных
  • Service, которое предоставляет некоторые функции, обычно через открытый API,В зависимости от уровня, это может быть, например, автономный контейнер RESTful или класс, который позволяет вам найти конкретный экземпляр нужного типа.

Исходный ответ

Это термины , которые широко используются в (распределенном) доменно-ориентированном проектировании.Они не то же самое.Термин Модель объекта может использоваться как синоним к объекту домена .

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

Entity. Объект в основном определяется не его атрибутами, а потоком непрерывности и идентичности., (имеется в виду должен иметь Id )

POCO. Простой объект без сложной логики, обычно он имеет тольконесколько свойств и используется с ORM или в качестве объекта передачи данных

class Person - Entity и POCO, экземпляром этого класса является Domain Objectclass PersonService - Сервисclass PersonRepository - Хранилище

18 голосов
/ 27 мая 2011

Это скорее оттенок функции;объект домена - это нечто, характерное для вашей логической реализации, и может быть более сложным, чем простой POCO;сущность имеет коннотацию для представления чего-либо (обычно со ссылкой на постоянную среду), а POCO является просто быстрым идентификатором класса.Модель - это просто термин, используемый для представления объекта (обычно содержащий состояние и обычно относящийся к пользовательскому интерфейсу или базе данных).

Дело не в том, что есть какая-то функциональная разница, это просто разные термины, чтобы более точно описать что-то.Понравилась разница между гоночной машиной, грузовиком и семейным седаном.Все являются автомобилями, но каждый термин является более описательным.

14 голосов
/ 27 мая 2011

в основном это сводится к внутренней логике

  1. Объекты домена имеют внутреннюю логику в домене, такие как проверка и т. Д.
  2. Модель в основном представляет собой легкий объект Домена, они знают о данныхони хранят, но на самом деле ничего не говорят о том, как они будут использоваться
  3. Объекты хранят данные и имеют некоторые внутренние знания о том, откуда они пришли, и где они собираются сохранять, обновлять и т. д.данные и могут иметь некоторые внутренние знания о себе, такие как общая стоимость всех элементов в коллекции свойств
  4. DTO - самый простой элемент из всех, он просто содержит данные и не имеет логики

Все они в основном используются для одного и того же, просто насколько вы хотите, чтобы они были

в соответствии с вашим примером кода. Класс Person будет объектом домена или моделью,другие 2 - сервис и хранилище.Доменные объекты, Pocos, модели, dtos и т. Д. Используются как сообщения, передаваемые с одного уровня на другой, а класс обслуживания, такой как PersonService, является слоем в приложении и таким же, как и класс Repository, такой как PersonRepository.для хорошего обзора посмотрите http://bob -the-janitor.blogspot.com / 2009/07 / n-tier-design-revisit-part-1-over-view.html в этом случаеречь идет об использовании объекта данных, который в основном dto

10 голосов
/ 31 мая 2011

В приведенных выше ответах уже есть хорошие объяснения домена и модели.

В объекте базы данных и контекста означает элемент в модели отношений сущности ERD .(т.е. строка в таблице)

В объекте Microsoft-Dotnet-EntityFramework-World означает объект, который можно загрузить из базы данных и сохранить в базе данных, используя контекст данных (базы),Обычно сущность не может существовать без своего контекста данных (базы).(Unit-) Тестирование бизнес-функциональности этих классов затруднено.

Pocos (простые старые объекты CommonRuntime) могут существовать без PersistenceFramework (EntityFramework или NHibernate), поэтому их гораздо проще тестировать.

Слово poco - это адаптация pojo (простой старый объект Java) , которые были созданы в мире Java по той же причине.

5 голосов
/ 30 января 2015

Просто подсказка дизайна.

Вместо использования:

class PersonService
{
    private PersonRepository pRepository;

    PersonService()
    {
        pRepository = new PersonRepository();
    }
}

Использование:

class PersonService
{
    private PersonRepository pRepository;

    PersonService(PersonRepository pRepository)
    {
        this.pRepository = pRepository;
    }
}

Для обеспечения внедрения зависимости в PersonService.

3 голосов
/ 27 мая 2011

Доменный объект - это сущность в доменном слое вашего приложения, например. Адресный класс. «Модель» означает то же самое - сущность в «Доменной модели».

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

...