Предложения о том, как отобразиться от Домена (ORM), возражают против Объектов передачи данных (DTO)

Хорошо, внутренний цикл (цикл с k в качестве итератора) выполняется n-j+1 раз, поскольку он начинается с j и заканчивается на n.

Общее количество шагов , которое выполняет средний цикл for, является суммой шагов на итерацию для j, так что это означает, что общее количество раз, которое мы выполняем тело внутреннего Цикл for:

 n
---
\                  n * (n + 1)
/    n - j + 1  = -------------
---                    2
j=1

, поэтому после одной итерации внешнего цикла (с итератором i) мы имеем n*(n+1)/2 шагов.

Таким образом, в целом наш алгоритм будет выполнять тело внутреннего цикла в общей сложности n * n * (n+1)/2 раз. Поскольку внешний цикл выполняется n раз, а количество шагов в теле этого цикла не не , зависит от значения самого i.

Если мы считаем, что часть num <- j + 1 выполняется в постоянное время (строго говоря, суммирование огромных чисел не может быть выполнено в постоянное время), то это, таким образом, O (n 3 ) алгоритм.

13
задан FryHard 4 September 2008 в 07:04
поделиться

5 ответов

Мои извинения за то, что не действительно вставили детали здесь, но основной подход OO состояли бы в том, чтобы сделать DTO членом класса ActiveRecord и сделать, чтобы ActiveRecord делегировал средства доступа и мутаторы к DTO. Вы могли использовать инструменты генерации кода или рефакторинга для создания классов DTO довольно быстро из классов AcitveRecord.

0
ответ дан 2 December 2019 в 00:19
поделиться
1138 На самом деле я сейчас совсем запутался. Потому что вы говорите: «Поэтому мы ищем способ легко преобразовать (мыслить автоматически) из объектов Домена (которые знают, что БД существует и заботятся) в объект DTO (которые ничего не знают о БД и не заботятся о сессиях» , сопоставление атрибутов или все это ORM). "

  1. Доменные объекты знают и заботятся о БД? Не в этом ли смысл доменных объектов содержать ТОЛЬКО бизнес-логику и полностью не знать о БД и ORM? .... У вас должны быть эти объекты? Вам просто нужно ИСПРАВИТЬ их, если они содержат все эти вещи ... вот почему я немного запутался, как появился DTO

  2. Не могли бы вы предоставить более подробную информацию о том, с какими проблемами вы сталкиваетесь при отложенной загрузке?

0
ответ дан 2 December 2019 в 00:19
поделиться

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

public static T ChangeType<S, T>(this S source) where T : class, new()

В первый раз, когда этот метод (или любая из других перегрузок) выполняется для двух типов, он смотрит на свойства каждого типа и решает, которые существуют и в на основе имени и в типа. Это берет это 'членское пересечение' и использует класс DynamicMethod для emil IL для копирования исходного типа в целевой тип, тогда это кэширует получающегося делегата в ориентированном на многопотоковое исполнение статическом словаре.

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

public static T ChangeType<S, T>(this S source, Action<S, T> additionalOperations) where T : class, new()

..., таким образом, Вы могли сделать это для своей Личности к примеру PersonDTO:

Person p = new Person( /* set whatever */);
PersonDTO = p.ChangeType<Person, PersonDTO>();

И любые свойства и на Человеке и на PersonDTO (снова, которые имеют то же имя и тип) был бы скопирован испускаемым методом времени выполнения, и любые последующие вызовы не должны будут быть испущены, но снова использовали бы тот же испускаемый код для тех типов в том порядке (т.е. копирование PersonDTO Человеку также подвергнется хиту для испускания кода).

Это - слишком много кода для регистрации, но если Вам будет интересно, то я приложу усилие, чтобы загрузить образец на SkyDrive и отправить ссылку здесь.

Richard

9
ответ дан 2 December 2019 в 00:19
поделиться

Вам следует использовать automapper, о котором я писал здесь:

http://januszstabik.blogspot.com/2010/04/automatically-map- your-heavyweight-orm.html # links

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

2
ответ дан 2 December 2019 в 00:19
поделиться

используйте ValueInjecter , с его помощью вы можете сопоставить что угодно с чем угодно, например

  • объект <-> объект
  • объект <-> Form / WebForm
  • DataReader -> объект

и у него есть интересные функции, такие как: выравнивание и выравнивание

загрузка содержит множество образцов

4
ответ дан 2 December 2019 в 00:19
поделиться
Другие вопросы по тегам:

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