Проектирование сложных объектов: чтобы не пришлось извлекать весь граф объекта - PullRequest
0 голосов
/ 24 января 2011

Не уверен, какой заголовок будет лучшим для этого вопроса, или даже если я проясню, но вот он:

Каков наилучший способ настройки сложных объектов, чтобы не приходилось извлекатьвесь граф объектов при первом обращении к родительскому объекту?

Например: Заказ

  • имеет клиента

  • строк заказа (много)

    • товар

      • цена
    • ценыдетали (скидки и т. д.)

    • статус заказа

  • статус

  • дата исполнения

Вы бы создали Заказ со всеми его зависимыми объектами в качестве свойств или предоставили бы метод доступа для зависимых объектов?

пример:

Вариант 1:

класс Заказ

  • публичная собственность Заказчик

  • публичная собственность СписокЛинии заказа

Вариант 2:

Класс заказа

- public GetCustomer():Customer

- public GetOrderLines():List of order lines

На мой взгляд, у каждого есть свои преимущества и недостатки:

Вариант 1: Диаграммы классов показывают отношения между различными объектами.Недостатком является то, что при получении объекта Order необходимо получить весь граф объектов (который может стоить дорого, а во многих случаях может оказаться ненужным).

Вариант 2: Потому чтокаждый объект извлекается с помощью вызова Get, вы можете отложить фактическое извлечение, когда объект необходим.Недостаток, по крайней мере, в диаграммах классов Visual Studio, вы больше не можете получить хорошие отношения между различными объектами.

Существуют ли другие шаблоны проектирования, которые могут выполнить то, что я пытаюсь более эффективно?

Ответы [ 2 ]

4 голосов
/ 24 января 2011

Рассматриваете ли вы использование ORM, такого как Entity Framework или NHibernate?Таким образом, вы получите поддержку Lazy Loading без особых трудностей, связанных с ее реализацией.

2 голосов
/ 24 января 2011

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

Я бы, наверное, выбрал здесь свойство, так как оно более идиоматично для C #. Что касается отсрочки извлечения объекта, то это зависит от вашего контекста - как писал anon, когда рисование из базы данных может быть заметно ленивой загрузкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...