Передавать объекты, которые описывают ваш домен напрямую в отображение можно только в очень простых CRUD приложения, которые никогда никто не будет развивать
модель домена совпадает с моделью в MVC в той части где это не обременительно
У меня достаточно опыта с этими реализациями, чтобы так заявлять.
xxx:
Сначала, в начальной школе, нам говорят, что нельзя вычитать из большего меньшее. Потом, в старших классах, оказывается, что всё-таки можно.
У меня достаточно опыта с этими реализациями, чтобы так заявлять.Я думаю, существует множество людей, которые заявят, что у них достаточно опыта с этими реализациями, чтобы заявлять, что с ними всё нормально.
Я одно время работал с Юнити еще даже версии 1.2 - всё было замечательно. ЕФ в отдельных задачах круче/проще/быстрее НХ.
Подход с Query-Command, например, тоже далеко не всегда оптимален. Даже если оптимален - чтобы его изучить и понять, как применять оптимально - нужно время (и много), да и способности. А если применять не разобравшись - будет только лишняя абстракция и нагромождение.Так вот во всех учебных примерах упоминаются репозитории - поэтому все так и делают. А они тоже не всегда оптимальны. А кучи разработчиков и не задумываются - берут широко упоминаемый шаблон и вперед.
xxx:Сначала, в начальной школе, нам говорят, что нельзя вычитать из большего меньшее. Потом, в старших классах, оказывается, что всё-таки можно.Смешной пример, но разве было бы лучше, если бы в начальной школе сразу давали комплексные числа?Мне как раз кажется логичным, что знакомиться с библиотеками/фреймворками лучше на статьях "начального уровня", не углубляясь в детали, а по мере роста потребностей продолжать изучение принципов и расширений уже по статьям другого уровня, подключая и переосмысляя свой предыдущий опыт проектирования, пусть даже в других областях.
на статьях "начального уровня", не углубляясь в детали, а по мере роста потребностей продолжать изучение принципов и расширений уже по статьям другого уровня
Людей умеющих так делать - единицы.
Я одно время работал с Юнити еще даже версии 1.2 - всё было замечательно. ЕФ в отдельных задачах круче/проще/быстрее НХ.
Не верю, что EF будет работать быстрее NH. Не будьте голословными - приведите пример.
Да, они просто не знают того, чего они не знают. Говоря умными словами находятся в квадрате неосознанной некомпетентности ( почитать: http://www.happy-pm.com/blog/?p=3312 ), другими словами - им не с чем сравнивать. Т.е. если ты не знаешь, что бывает что-то лучше, чем то, чем ты пользуешься, то тебя всё устраивает.
И вот тут в полный рост встаёт проблема адекватных примеров.
Я одно время работал с Юнити еще даже версии 1.2 - всё было замечательно. ЕФ в отдельных задачах круче/проще/быстрее НХ.
Не верю, что EF будет работать быстрее NH. Не будьте голословными - приведите пример.Не ЕФ будет работать быстрее, а с ЕФ будет работать быстрее.
Пример - конвертация БД из одного формата в другой. Воспользоваться автосгенеренной моделькой от ЕФа быстрее, чем писать все доменные классы руками.
Да, они просто не знают того, чего они не знают. Говоря умными словами находятся в квадрате неосознанной некомпетентности ( почитать: http://www.happy-pm.com/blog/?p=3312 ), другими словами - им не с чем сравнивать. Т.е. если ты не знаешь, что бывает что-то лучше, чем то, чем ты пользуешься, то тебя всё устраивает.
Щас уйдем в глубокое теоретизирование :)
Для выбора используемых технологий есть куча причин - в том числе и уже существующие знания команды по какой-либо технологии,
и время "старта",
и гарантия поддержки,
и уже используемые технологии в проекте (если проект не новый),
и сообщество.
Грубо говоря, найти специалиста, который знает Юнити или ЕФ проще,
чем, допустим, Castle.Windsor и LLBLGen.
Пусть и по nih-причинам.
На крупных проектах с этим тоже приходится считаться.
А ты говоришь, что выбор ЕФ или Юнити - это исключительно неосознанная некомпетентность.
С этим я в корне не согласен.
Человек в статье описал опыт быстрого старта. Он реально быстрый. И простой. Ну да, он с ЕФ. Видимо, с ЕФ старт быстрее.
Говорить, условно, что "ну ты дурак, что же ты не копнул глубже и не написал про НХ и ninject" - ну так он никому не обязан ни о чем писать.
Он нашел простое решение. Почему-то решение на НХ для него не показалось проще - как минимум информация о нем нашлась не первой строкой. А это тоже важно.
И вот тут в полный рост встаёт проблема адекватных примеров.Напишите аналогичное основанное на своих библиотеках - будет отлично (если никто не придет и не скажет, ай-ай-ай, а почему ты не использовал Т4, с ним же в 100 раз быстрее :)).
Больше статей хороших и разных :)
А коменты все равно никто не читает - ругаться там смысла нет :)
public Project Project {get;set;}
public List<Users> AllUsers {get;set;}
}
public ActionResult ProjectDetails(Project project) {
}
Не верю, что EF будет работать быстрее NH. Не будьте голословными - приведите пример.
Не ЕФ будет работать быстрее, а с ЕФ будет работать быстрее.
Полностью не согласен. Да, возможен(!!!) быстрый старт, но потом обязательно начинаются проблемы. Кроме проблемы enum есть другая проблема - ограниченная поддержка linq. И если в NH есть другие механизмы запросов, то в EF - нет.
Пример - конвертация БД из одного формата в другой. Воспользоваться автосгенеренной моделькой от ЕФа быстрее, чем писать все доменные классы руками.Тут я вообще не буду использовать ORM, и либо напишу запрос, либо буду использовать ADO.NET.
Да, они просто не знают того, чего они не знают. Говоря умными словами находятся в квадрате неосознанной некомпетентности ( почитать: http://www.happy-pm.com/blog/?p=3312 ), другими словами - им не с чем сравнивать. Т.е. если ты не знаешь, что бывает что-то лучше, чем то, чем ты пользуешься, то тебя всё устраивает.
Щас уйдем в глубокое теоретизирование :)Да без проблем - формат группы это позволяет.Для выбора используемых технологий есть куча причин - в том числе и уже существующие знания команды по какой-либо технологии,Ок, с этим соглашусь.и время "старта",Не соглашусь, т.к. для NH есть куча автогенераторов, и, по-крайней мере у меня, есть проект для быстрого старта, который позволяет добавлять сущности как обычные классы - добавил реализацию IEntity и оно у тебя уже в базе сохраняется.и гарантия поддержки,Все ответы оф. тех. поддержки EF были в духе - "Прости, чувак, но EF это не умеет. Не используй это. Но, возможно, будет поддержка в версии vNextNextNext - подожди годик - два". С NH я могу запилить поддержку того, что мне не хватает сам, и, на крайний случай (если мой реквест не приняли), использовать кастомную сборку.А опыт использования коммерческой LLBLGen вообще был шикарен, любой запрос решался через несколько дней со словами, вот, попробуйте новую сборку - всё уже пофиксено.и уже используемые технологии в проекте (если проект не новый),Ок, но иногда думать нужно на перед, смотреть какие предложения есть на рынке, сравнивать по различным параметрам и т.д.и сообщество.Сообщество NH гораздо больше.Грубо говоря, найти специалиста, который знает Юнити или ЕФ проще,Спорно.чем, допустим, Castle.Windsor и LLBLGen.Тоже спорно.Пусть и по nih-причинам.Не понимать.
Человек в статье описал опыт быстрого старта. Он реально быстрый. И простой. Ну да, он с ЕФ. Видимо, с ЕФ старт быстрее.
Ключевое слово "видимо", т.е. из этого предложения я могу сделать вывод, что с NH или LLBLGen вы просто не работали. Старт с NH (используя FNH) быстрее в разы. А с LLBLGen Pro еще быстрее, даже с 0 бэкграундом.
На крупных проектах с этим тоже приходится считаться.С чем с этим? С мнениями типа "я тут уже 13 лет разрабатываю на EF (подставить любую другую технологию), иди пасись"?
А ты говоришь, что выбор ЕФ или Юнити - это исключительно неосознанная некомпетентность.Я этого не говорил. Я говорил, что те, кто выбирают EF или Unity и другие велосипеды от M$ чаще всего становятся жертвами маркетологов и прочих евангелистов (привет, Сергей) и просто не знают, что есть что-то другое. Т.к. человек, почувствовавший раз силу NH никогда больше не будет использовать EF, а если будет использовать, то будет материться через слово (привет, Тимур;)).
Я говорил, что те, кто выбирают EF или Unity и другие велосипеды от M$ чаще всего становятся жертвами маркетологов и прочих евангелистов
С этим я в корне не согласен.Очень удобно не соглашаться с тем, чего не говорили;)
Старт с NH (используя FNH) быстрее в разы.
Старт с NH (используя FNH) быстрее в разы.Под "стартом", чтобы не быть неправильно понятым, я понимаю именно порог вхождения. Первый проект, знакомство с технологией."Старт" можно еще трактовать как запуск проекта "с нуля", но я не это имел ввиду в вопросах и ответах.
Я, честно говоря, не представляю, какой старт может быть быстрее EF-database-first, при котором после пары кликов мышкой за тебя всё сразу сгенерено и понятный интерфейс готов к использованию без какой-либо конфигурации и маппингов вообще.
Но, видимо, мои представления не совпадают с мнением большинства. Окей :)
А какое "множество искуственных ограничений" есть в ЕФ кроме приснопамятного enum-support
(который, кстати, в версии для .net 4.5 наконец-то присутствует :))?
2 мая 2012 г. 20:17 пользователь Artur Drobinskiy <artur.dr...@gmail.com> написал:Я, честно говоря, не представляю, какой старт может быть быстрее EF-database-first, при котором после пары кликов мышкой за тебя всё сразу сгенерено и понятный интерфейс готов к использованию без какой-либо конфигурации и маппингов вообще.Ну вообще речь идет о CodeFirst. Во-вторых, для Datebase First нужна уже спроектированная база, это раз. Третье, для меня создать базу будет медленнее, чем написать сущности, которые потом сами смапятся в базу.
Но, видимо, мои представления не совпадают с мнением большинства. Окей :)Большинство не всегда право.А какое "множество искуственных ограничений" есть в ЕФ кроме приснопамятного enum-supportЭтого не достаточно? Ок, тогда еще один минус - нельзя мапить свои функции (например экстеншн методы) в функции базы (в NH - можно).
(который, кстати, в версии для .net 4.5 наконец-то присутствует :))?Только самого .net 4.5 еще нет. Кстати, раз уж зашла речь про .net 4.5 мы опять видим, что M$ насаждает свои технологии и инструменты - заставляет покупать новую среду для новой платформы.
2 мая 2012 г. 20:17 пользователь Artur Drobinskiy <artur.dr...@gmail.com> написал:Я, честно говоря, не представляю, какой старт может быть быстрее EF-database-first, при котором после пары кликов мышкой за тебя всё сразу сгенерено и понятный интерфейс готов к использованию без какой-либо конфигурации и маппингов вообще.Ну вообще речь идет о CodeFirst. Во-вторых, для Datebase First нужна уже спроектированная база, это раз. Третье, для меня создать базу будет медленнее, чем написать сущности, которые потом сами смапятся в базу.Возможно, я спроектировал своё знакомство с ЕФ на текущую ситуацию.. ну и казалось естественным, что
первые пробы ОРМ будут по уже существующей БД.
Со своей стороны основые плюсы ЕФ я вижу именно в случаях database-first подходов.
Но, видимо, мои представления не совпадают с мнением большинства. Окей :)Большинство не всегда право.А какое "множество искуственных ограничений" есть в ЕФ кроме приснопамятного enum-supportЭтого не достаточно? Ок, тогда еще один минус - нельзя мапить свои функции (например экстеншн методы) в функции базы (в NH - можно).Ну под термином "множество ограничений" я обычно понимаю больше, чем одно, вот любопытно стало уточнить. Дай, пожалуйста, ссылку, какую именно фичу НХ ты имеешь ввиду, я или недопонял, или не сталкивался с таким.
(который, кстати, в версии для .net 4.5 наконец-то присутствует :))?Только самого .net 4.5 еще нет. Кстати, раз уж зашла речь про .net 4.5 мы опять видим, что M$ насаждает свои технологии и инструменты - заставляет покупать новую среду для новой платформы.Есть в бета-версии.
Про насаждение - это уже полный оффтоп :) Есть бесплатные инструменты. За удобство - платим.
Грубый пример:
В сложных случаях, конечно, вьюмоделька растет за счет результатов вычислений/операций внутри контроллера.
public class IndexViewModel {
public Project Project {get;set;}
public List<Users> AllUsers {get;set;}
}
public class IndexViewModel {
public Project Project {get;set;}
public List<UserViewModel> AllUsers {get;set;}
}
On 3 май, 08:23, Alexander Byndyu <alexander.byn...@gmail.com> wrote:
> Может быть, что в списке List<Users> для каждого пользователя вам нужно
> будет вычислить какое-то поле, например, IsPaidAccessEnabled, которое
> необходимо только для отображения. Тогда вы сделаете, что-то типа:
>
> public class IndexViewModel {
>
> public Project Project {get;set;}
>
> public List<*UserViewModel*> AllUsers {get;set;}
>
> }
>
> Так?
Я делаю именно так (с тех пор как меня просветили в ответ на мой
вопрос http://groups.google.com/group/dotnetconf/browse_thread/thread/c28b811257f09ef5,
за что еще раз спасибо всем участникам :). Думаю, может быть даже так:
public class IndexViewModel {
public *ProjectViewModel* Project {get;set;}
public List<*UserViewModel*> AllUsers {get;set;}
}
потому что возможно, что нам не нужен весь Project целиком в этом
представлении, может быть мы только название этого проекта показываем
где-нибудь в заголовке.
Действительно гораздо удобнее использовать специализированные вью-
модели вместо объектов домена. А больше всего мне нравится, что
благодаря этому домен и UI оказываются гораздо слабее связаны между
собой.
Здесь IndexViewModel уже не доменный объект, а как раз модель для передачи во View.
только в сложных ситуациях модель не является просто композицией доменных объектов.
для каждого пользователя вам нужно будет вычислить какое-то поле, например, IsPaidAccessEnabled
public List<UserViewModel> AllUsers {get;set;}
2 мая 2012 г. 22:51 пользователь Artur Drobinskiy <artur.dr...@gmail.com> написал:2 мая 2012 г. 20:17 пользователь Artur Drobinskiy <artur.dr...@gmail.com> написал:Я, честно говоря, не представляю, какой старт может быть быстрее EF-database-first, при котором после пары кликов мышкой за тебя всё сразу сгенерено и понятный интерфейс готов к использованию без какой-либо конфигурации и маппингов вообще.Ну вообще речь идет о CodeFirst. Во-вторых, для Datebase First нужна уже спроектированная база, это раз. Третье, для меня создать базу будет медленнее, чем написать сущности, которые потом сами смапятся в базу.Возможно, я спроектировал своё знакомство с ЕФ на текущую ситуацию.. ну и казалось естественным, чтопервые пробы ОРМ будут по уже существующей БД.Ерунда какая.Со своей стороны основые плюсы ЕФ я вижу именно в случаях database-first подходов.А нафига тогда парни стараются, делают CF, и прочие персистент игнорансы?
Но, видимо, мои представления не совпадают с мнением большинства. Окей :)Большинство не всегда право.А какое "множество искуственных ограничений" есть в ЕФ кроме приснопамятного enum-supportЭтого не достаточно? Ок, тогда еще один минус - нельзя мапить свои функции (например экстеншн методы) в функции базы (в NH - можно).Ну под термином "множество ограничений" я обычно понимаю больше, чем одно, вот любопытно стало уточнить. Дай, пожалуйста, ссылку, какую именно фичу НХ ты имеешь ввиду, я или недопонял, или не сталкивался с таким.Помечаешь метод, как [LinqExtensionMethod] и его вызовы транслируются в вызов SQL-функции.
Здесь IndexViewModel уже не доменный объект, а как раз модель для передачи во View.Конечно, я и писал, чтотолько в сложных ситуациях модель не является просто композицией доменных объектов.То есть модель - это не один доменный объект в любом случае, а несколько, их композиция.для каждого пользователя вам нужно будет вычислить какое-то поле, например, IsPaidAccessEnabledpublic List<UserViewModel> AllUsers {get;set;}Да, весьма вероятно. Но на моей практике это достаточно редкая ситуация. Чаще такие поля либо заслуживают быть помещенными в домен (если они вычисляются на основе других полей сущности User и используются во многих местах, то есть имеют доменный смысл), либо это простая вьюшная логика (типа, не знаю, цвета колонки), в этом случае она и находится во вью.
2 мая 2012 г. 22:51 пользователь Artur Drobinskiy <artur.dr...@gmail.com> написал:2 мая 2012 г. 20:17 пользователь Artur Drobinskiy <artur.dr...@gmail.com> написал:Я, честно говоря, не представляю, какой старт может быть быстрее EF-database-first, при котором после пары кликов мышкой за тебя всё сразу сгенерено и понятный интерфейс готов к использованию без какой-либо конфигурации и маппингов вообще.Ну вообще речь идет о CodeFirst. Во-вторых, для Datebase First нужна уже спроектированная база, это раз. Третье, для меня создать базу будет медленнее, чем написать сущности, которые потом сами смапятся в базу.Возможно, я спроектировал своё знакомство с ЕФ на текущую ситуацию.. ну и казалось естественным, чтопервые пробы ОРМ будут по уже существующей БД.Ерунда какая.Со своей стороны основые плюсы ЕФ я вижу именно в случаях database-first подходов.А нафига тогда парни стараются, делают CF, и прочие персистент игнорансы?Для каждой задачи есть своё наилучшее решение. Есть ситуации, когда у одной БД два клиента. В этом случае как минимум в случае одного клиента полный персистанс игноранс не выйдет.
3 мая 2012 г. 14:27 пользователь Alexander I. Zaytsev <hazzik...@gmail.com> написал:
3 мая 2012 г. 13:17 пользователь Artur Drobinskiy <artur.dr...@gmail.com> написал:Здесь IndexViewModel уже не доменный объект, а как раз модель для передачи во View.Конечно, я и писал, чтотолько в сложных ситуациях модель не является просто композицией доменных объектов.То есть модель - это не один доменный объект в любом случае, а несколько, их композиция.для каждого пользователя вам нужно будет вычислить какое-то поле, например, IsPaidAccessEnabledpublic List<UserViewModel> AllUsers {get;set;}Да, весьма вероятно. Но на моей практике это достаточно редкая ситуация. Чаще такие поля либо заслуживают быть помещенными в домен (если они вычисляются на основе других полей сущности User и используются во многих местах, то есть имеют доменный смысл), либо это простая вьюшная логика (типа, не знаю, цвета колонки), в этом случае она и находится во вью.Приведу пример: у вас есть такая "ViewModel", в которую пропиханы сохраняемые классы, и в один прекрасный момент другой разработик захочет в этой вьюхе использовать навигационное поле:@foreach (var user in Model.AllUsers) {@* some logic*@Products count: @user.Products.Count()}При этом, он просто возьмет и добавит этот код, не задумываясь о том, подгружены ли продукты или нет.При этом, если у вас контекст уничтожается после отрисовки вью, то вы получите SELECT N+1. Если же контекст уничтожается после вызова экшена, то вы получите LazyLoadException.При первом варианте - все хорошо и замечательно - ваш программист счастлив и закоммитил код.Во втором варианте он протестировал и увидел, что это не работает (а бывает, что просто залез на продакшен и поправил вьюшку там), добавил Include(x=>x.Products) в запрос. Итого, везде, где у вас будет использоваться этот запрос, будет делаться join к Product, который, возможно, не нужен.С batch-size SELECT N+1 не будет.Если в итоге это не отражается на производительности (если User.Products это товары в корзине и их в большинстве случае мало) - то счастливы все.
Если производительность пострадала, то "другой разработчик" должен был думать головой.
Впрочем, с помощью профайлера это будет скорее всего замечено позже.
Я сторонник прежде всего подхода "думать головой", а не ограничений, которые усложняют простые операции.
А накосячить всегда можно.
Саша, я не пытаюсь тебя переубедить и уж тем более не пытаюсь сказать, что твой подход плох.Мой подход другой. В других условиях и при других задачах, возможно, я бы склонялся к другим подходам.