BG Development


Страници: (3) [1] 2 3   ( Първото ново мнение ) Reply to this topicStart new topicStart Poll

> Entity Framework и "правилното" му използване
pollutionMan
Публикувано на: 11-05-2018, 12:46
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 5
Регистриран на: 27.01.18



Трябва да накодя тестове около Entity Framework, която не предоставя interface, който мога да mock-на. Първата ми мисъл беше просто да направя IDatabase с IDbSet-ове, където да сложа шано колекциите, които ми трябват.

Все пак потърсих в интернета какво ще кажат по въпроса архитектурните богове. Оказа се че "правилното" използване на EF е тежък въпрос с неясен отговор.

Изглежда че преди години "правият път" е бил да се ползва Repository Pattern и Unit Of Work, където се изписват стотици редове код, за да можело всичко да се abstract-не away дотолкова, че накрая да бъде тайна, че Repository-то ползвало EF under the hood. Някакъв гуру обоснова пълното разписване на съмнително четимите патърни с "може един ден да искаш да смениш базата си от релационна в JSON или XML такава" (!!!!).

В последствие май имало разногласия относно int SaveChanges(), поради причини, които ме мързи да чета.

Има и едно видео на терлиците от миналата година, където отвеждат "качеството" до следващото ниво и след 3 часа писане на абстракции резултатът е че примерно клас ShitService има достъп само до Shit таблицата от базата. По този начин с 3 часа писане на кошмарен за редактиране код избягваме code smell-ът "Service Locator"!

Текущо пък разни гурута тотално отричат Repository и Unit of Work, заклеймяват ползвачите им от едно време като hype-driven зубрачи и проповядват да се използва CQRS, с което изобщо не съм запознат и май дори няма приложно демо как се имплементира с EF черно на бяло в github или някъде другаде.

Вие как използвате Entity Framework?
PMEmail Poster
Top
Gamma Goblin
Публикувано на: 11-05-2018, 12:50
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1242
Регистриран на: 21.02.18



QUOTE
лед 3 часа писане на абстракции резултатът е че примерно клас ShitService има достъп само до Shit таблицата от базата. По този начин с 3 часа писане на кошмарен за редактиране код избягваме code smell-ът "Service Locator"!
Очевидно е че не знаеш какво е service locator. На краива ракета са и криви къдриците

Това мнение е било редактирано от Gamma Goblin на 11-05-2018, 12:51


--------------------
Напред! Живота е сраженье! Напред! И прав всегда ходи!
Напред, макар към поражение! Ако ще паднеш, прав падни!
---
Raw, and untamed in spirit, We chew this world and Spit it out
---
Challenge my own world to chaos
---
Im not intimidated by the good looking ones, it's the ugly ones that scare the shit out of me
PMEmail PosterUsers Website
Top
stewie
Публикувано на: 11-05-2018, 13:08
Quote Post



Име:
Група: Форумен член
Ранг: Почетен член

Мнения: 4155
Регистриран на: 14.07.16



Ох батьо а със CQRS как ще си го набиете ако почнете. И там ще си биеш главата ми това са как да го мокна. Карай на интеграционни тестове където не става юнит. Иначе за SaveChanges ще трябва да мокваш всеки път какъв db context да се ползва. Ако репозитори и юнит ъф уорк ти се виждат хайп ти да видиш CQRS и micro services какъв хайп са.
PM
Top
stewie
Публикувано на: 11-05-2018, 13:09
Quote Post



Име:
Група: Форумен член
Ранг: Почетен член

Мнения: 4155
Регистриран на: 14.07.16



*Поправка какъв dbcontext трябва да върне и да се ползва (не мога да си едитвам коментарите)
PM
Top
pollutionMan
Публикувано на: 11-05-2018, 13:36
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 5
Регистриран на: 27.01.18



А, нищо важно, правя CRUD за една фирмичка и искаха да се ползва EF, който не съм виждал как се ползва на практика, потърсих best practices за използване и не очаквах да намеря всичко това.

Bender, в телеришкото видео използваха "Service Locator" в смисъла на "инжектиран обект, който предоставя видимост към много неща и свободата да ги манипулираш и това е грешно, защото scope-а ти трябва да е ограничен и инжектираният обект трябва да предоставя видимост само към точно определено relevant нещо/неща". Грешно ли е? Не ми се търси точната секунда на видеото, защото е 9 часа.
PMEmail Poster
Top
Golden Gega
Публикувано на: 11-05-2018, 14:43
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 999
Регистриран на: 04.06.10



Всеки ОРМ предоставя някакъв баланс между четимост, скорост на писане и скорост на изпълнение. Умния човек ще търси да използва това кото му трябва - специално в ОРМ-ите се търси бързина на разработка - и когато опре до проблемни зони (за ОРМ - бързодействие) ще търси варианти - дали sp, дали нещо друго.
Тъпанарите, които за нещастие или щастие са повече, се фокусират върху патерни и подходи, като единствения практически резултат е усещането че нещата се правят "правилно".
В работата ми оставам приятно удивен как младежта усилено използва unit of work върху EF (понеже масовите видеа, например на джедаите от терлик) усилено говорят за невероятните ползи от тоя и прочее подходи (да отбележа че ние например не правим unit tests). Преди време с друг квалифициран колега дори губихме време в спорове по темата, без да получа смислено обяснение кое е практическото предимство на тоя и оня шаблон. Под практическо аз разбирам - време за изработка/поддръжка например.
Всъщност нещата са относително прости. В M$ света достъпа до различни бази данни (конкретно в случая говоря за релационни такива) е решен на ниво драйвер, демек на едно ниво под ОРМ-а. Да отбележа все пак че разглеждаме масовия случай на едно приложение с една релационна база.
Всяка следваща абстракция е смислена само ако под тая абстракция има поне две неща с някакви съществени разлики с които искаш да работиш по един начин - за има смисъл въобще да абстрактираш нещо.
Японския принцип за създаване на статуя е - взимаш един камък и махаш всичко излишно. В ИТ света това означава да вземеш една платформа/база/език/... и да използваш минимума за да постигнеш целите си. Оказва се че това е неразгадаема парадигма и непостижим шаблон за магьосниците на патерни/шаблони от терлик. Което ме кара да си пускам Френки Милър и да пея с него: "Наранява ме дълбоко, наранява ме широко".

PMEmail Poster
Top
stewie
Публикувано на: 11-05-2018, 15:43
Quote Post



Име:
Група: Форумен член
Ранг: Почетен член

Мнения: 4155
Регистриран на: 14.07.16



Искренно се съмнявам, че тея у терлика въобще разбират шаблоните. В наше време никой не учи шаблони и как и кога да ги прилага, а копира наготово и тъпче като мощен негър тясна германка докато не влезе. Нещо като да натъпчеш пица в дюнер и да се похвалиш, че си открил кирията на гурме храненето.
PM
Top
stewie
Публикувано на: 11-05-2018, 15:57
Quote Post



Име:
Група: Форумен член
Ранг: Почетен член

Мнения: 4155
Регистриран на: 14.07.16



Като открехнахме дейта ацес темата, seen it, done it all :
В зората 2002-3 - некадърниците sql в кода кадърните SP. Велик е ADO.NET !
После писане на собствени ORM-и и генератори.
2005-а почват да излиза платени.
2007-8 айде юруш на LINQ to SQL, ама ако си с Oracle и MySQL духаш.
2008-9 айде юруш на EF.
После айде на репозитори патърн, ама да е генерик иначе не струва.
Ама дай и единица работа да натъпчем, че то иначе овър инджектваме като луди
Някои се мъчиха да нарекат репозиторитата си дейта сървиси, но и на тях не им се размина.
Излязоха документните бази на мода (биг дейта А-У), EF се насра, но си обърса малко задника като стана EF Core.
Заеби репозиторита, давай CQRS, че много върви с микро сървиси. Ама г-н архитект командата/заявката трябва да достъпи данни от друга колекция/таблица ??? Няма проблем земи тея дейта сървиси, които са генерик и пак приличат на репозиторита и ги натъпчи в командата/заявката.

И накрая кво ? Истината е, че колкото и да пренаписваме, нищо не става по тестваемо, нито по-удобно за поддръжка, просто си играеме в пясъчника и въртим едни пари. Всички стари програмисти сме self righteous pricks, но малко си го признаваме. Но няма как, така е устроен бизнеса.

Това мнение е било редактирано от DarkOne на 11-05-2018, 21:01
PM
Top
pollutionMan
Публикувано на: 11-05-2018, 16:44
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 5
Регистриран на: 27.01.18



https://www.youtube.com/watch?v=Sf9I3HYGSc4

3:57:58 - Казва че в msdn така било написано и дава пример от живия живот как телеришката система за изпити е накодена спрямо инструкциите на корпорацията-майка.

4:00:50 - Накодил е модифицирано-bastardized CRUD Repository патърн, по-нататък дори преименува класа да се казва EfDbSetWrapper, за да е абсолютно ясно че това НЕ Е Repository патърн, той само използва идеите му! Иска data layer-а да е максимално простичък и просто да връща шибаните данни.

4:03:20 - "Не очаквам да го направите и вие така, но ще ви питам защо сте го направили така" и после скастря как щял да пита всеки поотделно защо е избрал да ползва 'чист' или bastardized Repository/UoW и не искал зазубрени отговори! icon_lol.gif

За жалост индустриите в които бих могъл да се преквалифицирам дават африкански заплати, така че копането продължава.
PMEmail Poster
Top
Stilgar
Публикувано на: 11-05-2018, 19:46
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 12054
Регистриран на: 13.05.08



Тестовете ли са ти проблема дето искаш да решиш? Заповядай - https://github.com/scott-xu/EntityFramework.Testing

За EF Core е още по-лесно щото си върви с вградена in memory база.

Това мнение е било редактирано от Stilgar на 11-05-2018, 19:47


--------------------
Опитахме се да го направим както трябва, но стана както винаги.
PMEmail PosterUsers Website
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Страници: (3) [1] 2 3  Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2018 | BG Development | All Rights Reserved
RSS 2.0