|
Иньекция DbContext
|
|||
---|---|---|---|
#18+
fkthat Да и, как я уже писал, вызывать DAL прямо из контроллера это уже сама по себе хрень какая-то. Это не DAL, это UOW. UOW может реализовывать не только SaveChanges в DbContext-а, но выполнять любые другие завершающие операции: отправка сообщений в очередь, инициация событий, сохранение данных в другие репозитории. Мыслить рамками, что DbContext это абсолютно вся работа с данными что есть -- вредно. Это не так. fkthat А по-хорошему, если что-то шарится между разными компонентами, должно быть иммутабельно. Поскольку дбконтекст таковым не является, то от этого можно вполне ожидать какой-нибудь беды. Именно является. Как я уже сказал, это UOW. Проблема в твоих рассуждениях, что ты за DbContext видишь какой-то маленький кусочек, но не видишь остального. Ну и проблемы прям люто надуманные. Я не представляю что можно сделать, чтобы контекст в скоупе было плохим решением. Это надо ещё постараться. Ну и это признак явного говнокодища :) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 14:31 |
|
Иньекция DbContext
|
|||
---|---|---|---|
#18+
Shocker.Pro Ну вот смотри (как я расшифровываю подход Хвоста), само название Db Context делает его похожим на артефакты типа HttpContext и иже с ним. То есть вот у тебя запрос, он же скоуп, на него формируется HttpContext, DbContext еще какие-то контексты. Каждый из сервисов может модифицировать что-то в этом контексте, но закрытие и финальное решение по этим контекстам происходит именно в момент окончания работы со скоупом, ну в данном случае - это последние команды контроллера. Всё верно. Просто со времён развития идеи fat controller is evil, люди ушли в другую крайность, которая ещё хуже, чем жирные контроллеры. Именно контроллер отвечает за правильную организацию обработки запроса. От слова контроллер же! ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 14:32 |
|
Иньекция DbContext
|
|||
---|---|---|---|
#18+
fkthat А если он где-то в фильтре используется, или в middleware? И что? Не вижу никаких проблем. В фильтре или в миддлеваре вообще нужно избегать работы с DbContext. И действовать через разумные абстракции. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 14:33 |
|
Иньекция DbContext
|
|||
---|---|---|---|
#18+
hVostt В фильтре или в миддлеваре вообще нужно избегать работы с DbContext. И действовать через разумные абстракции. А я и не сказал, что напрямую использовать. Он может использоваться через какой-либо сервис BL. hVostt Именно контроллер отвечает за правильную организацию обработки запроса. От слова контроллер же! Контроллер отвечает за трансляцию HTTP-запроса в вызов сервиса(ов) BL и трансляцию ответа от BL в HTTP-ответ. Знать что-то о том, что лежит ниже BL он не имеет права. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 14:50 |
|
Иньекция DbContext
|
|||
---|---|---|---|
#18+
fkthat hVostt В фильтре или в миддлеваре вообще нужно избегать работы с DbContext. И действовать через разумные абстракции. А я и не сказал, что напрямую использовать. Он может использоваться через какой-либо сервис BL. Ну фиг знает, может у тебя фильтр для записи в БД лога запросов. И отсюда растут ноги у проблемы :) Конечно, так делать нельзя, DbContext для таких задач не предназначен. fkthat Контроллер отвечает за трансляцию HTTP-запроса в вызов сервиса(ов) BL и трансляцию ответа от BL в HTTP-ответ. Знать что-то о том, что лежит ниже BL он не имеет права. А он и не знает. Не вижу никаких противоречий ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 15:30 |
|
Иньекция DbContext
|
|||
---|---|---|---|
#18+
hVostt Ну фиг знает, может у тебя фильтр для записи в БД лога запросов. И отсюда растут ноги у проблемы :) ьзя, DbContext для таких задач не предназначен. У меня такого фильтра нет, я из ума не выжил, но я тут говорю о модульности. Я вызываю сервис, который писал вообще не я. Я не знаю и знать не хочу про него ничего, кроме того, что у него должно быть на входе (параметры) и на выходе (возвращаемое значение). А тут оказывается, что этот сервис втайне от меня изменяет окружение (DbContext) вообще всего что только можно, что в моем скоупе. Бог даже с ним с DbContext. Замени его на любой синглтон (или на скоупед, что тот же синглтон и есть, только для контекста), состояние которого кто угодно может поменять, и будет то же самое. Именно это мне и не нравится. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 15:39 |
|
Иньекция DbContext
|
|||
---|---|---|---|
#18+
fkthat А тут оказывается, что этот сервис втайне от меня изменяет окружение (DbContext) вообще всего что только можно ПОГОДИ! А если _этот сервис_ в тайне от тебя в БД что-то пишет? Что тогда? При чём тут тогда DbContext? :) И что он там такого может _изменить_, что повлияет на тебя? Я просто не понимаю. Это что вообще он там может такого сделать? fkthat Замени его на любой синглтон (или на скоупед, что тот же синглтон и есть, только для контекста), состояние которого кто угодно может поменять, и будет то же самое. Именно это мне и не нравится. Всё же хотелось бы более приземлённых примеров, в области практики. Мне на самом деле в архитектуре .NET, библиотек и решений много чего не нравится. Я даже не представляю что должно случиться, чтобы мне всё-всё нравилось :) Если такое вдруг случится, значит я достиг абсолютного дзена, и могу отделиться от своей земной оболочки и переместиться в абсолютно идеальный духовный мир. Надо как-то немного конкретней выделить проблему. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 17:24 |
|
Иньекция DbContext
|
|||
---|---|---|---|
#18+
hVostt А если _этот сервис_ в тайне от тебя в БД что-то пишет? Так пусть себе и пишет. Суть в том, что все при этом должно быть сделано так, чтобы меня, как потребителя этого сервиса это не волновало. Ты пользуешься кучей .NET API - а вдруг оно тоже что-то там куда-то пишет, что ты не знаешь - тебя это просто не волнует и все, т.к. оно если и пишет, то делает это так, что тебя не трогает. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 18:50 |
|
Иньекция DbContext
|
|||
---|---|---|---|
#18+
fkthat Так пусть себе и пишет. Суть в том, что все при этом должно быть сделано так, чтобы меня, как потребителя этого сервиса это не волновало. Ты пользуешься кучей .NET API - а вдруг оно тоже что-то там куда-то пишет, что ты не знаешь - тебя это просто не волнует и все, т.к. оно если и пишет, то делает это так, что тебя не трогает. Ну давай тогды IMemoryCache тоже сделаем транзиентным Как я уже говорил, от общего DbContext в скоупе есть реальный профит. Именно так он рекомендуется к использованию. Теоретически это тоже объясняется одним предложением: DbContext это UOW. Какие-то надуманные и высосанные из пальца проблемы, якобы кто-то другой в мой контекст влезет и что-то там сломает на практике совершенно не подтверждаются. Проект, который построен на EF уже по факту обладает довольно высокой связностью. Давай я пример ещё приведу. У тебя есть приложение на EF с контекстом. Ты решил добавить себе фоновые службы, вынес в отдельное сервисное приложение, как полагается. Взял хенгфаер. Теперь зырь: https://github.com/sergezhigunov/Hangfire.EntityFrameworkCore Намекаю на то, что задачи Hangfire никак не пересекаются с задачами твоего DbContext. Значит это другой контекст. И ещё намекаю, раз у тебя в рамках одного DbContext реализуются совершенно не связанные задачи и разнесённая на пару парсеков логика, значит у тебя явно нарушение SRP и ты пытаешься вылечить зрение через ж-пу :) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 20:05 |
|
Иньекция DbContext
|
|||
---|---|---|---|
#18+
hVostt И ещё намекаю, раз у тебя в рамках одного DbContext реализуются совершенно не связанные задачи и разнесённая на пару парсеков логика, значит у тебя явно нарушение SRP и ты пытаешься вылечить зрение через ж-пу :) Ага. Под каждый сервис БЛ будем заводить отдельный контекст и БД. Да что уж там - давай под каждый метод сервиса отдельный контекст. Одна из идей севиса (компонента) это инкапсуляция, что значит, что он не должен никак взаимодействовать со "внешним миром" кроме как через свой интерфейс-контракт. Если он начинает менять какие-то объекты, которые разделяет с другими сервисами, то это уже нарушение инкапсуляции. Неспроста ведь глобальные переменные, а также out, и ref параметры считаются говнокодом (ну, кроме Try-Get шаблона, может быть). Ровно по той же причине. Меня вообще доставляет, когда я регулярно вижу, как всё подряд, не глядя регают в контейнере как singleton или scoped - байты, блин экономят, что ли. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 20:33 |
|
Иньекция DbContext
|
|||
---|---|---|---|
#18+
fkthat, В упор не вижу, как нарушается инкапсуляция DbContext-а. Это ведь итак уже абстракция. Итак контракт. Давай ещё каждый отдельный компонент ЕДИНОГО приложения будет содержать свой драйвер БД, свой пул соединений, свою файловую систему, каждому классу по отдельной плашке памяти и т.д. и т.п. :) Вот сколько мы дискутируем, я так и не увидел ни одного хоть отдалённо приближенному к границам реальности кейса, где была обнаружена проблема, которую ты решаешь :) fkthat Меня вообще доставляет, когда я регулярно вижу, как всё подряд, не глядя регают в контейнере как singleton или scoped - байты, блин экономят, что ли. А почему нет? Вот у меня добрый десяток _изолированных_ компонентов используют DbContext в одном HTTP запросе. Мне что на обработку запроса десяток соединений к одной и той же БД создавать? Инженерия это прежде всего компромисс. Все шаблоны и принципы -- это борьба со сложностью, а не религия. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 21:17 |
|
Иньекция DbContext
|
|||
---|---|---|---|
#18+
ну наверное все ж от задачи и в вебе эт приемлемо. вопрос что если тебе 2 варика надо что придется дописать. меня лично вызывает не понятки что часто делпют репо + Uow поверх орм где по сути также репо и uow. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 21:25 |
|
Иньекция DbContext
|
|||
---|---|---|---|
#18+
handmadeFromRu ну наверное все ж от задачи и в вебе эт приемлемо. вопрос что если тебе 2 варика надо что придется дописать. меня лично вызывает не понятки что часто делпют репо + Uow поверх орм где по сути также репо и uow. продвинутые пацаны юзают CQ(R)S и на эту тему не парятся :) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 21:28 |
|
Иньекция DbContext
|
|||
---|---|---|---|
#18+
hVostt В упор не вижу, как нарушается инкапсуляция DbContext-а. Да никак она не нарушается. Я уже сто раз повторил. Просто один компонент может влиять на поведение другого через data context. Жить с этим можно, но я, все-таки, не вижу в этом ничего хорошего. hVostt Мне что на обработку запроса десяток соединений к одной и той же БД создавать? Еще скажи, что ты не слышал про connection pool и во времена ADO.NET делал один общий объект Connection на все приложение. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 21:31 |
|
Иньекция DbContext
|
|||
---|---|---|---|
#18+
hVostt продвинутые пацаны юзают CQ(R)S и на эту тему не парятся :) А CQRS в базу аки спаситель пешком по воде ходит? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 21:32 |
|
Иньекция DbContext
|
|||
---|---|---|---|
#18+
fkthat Просто один компонент может влиять на поведение другого через data context. Жить с этим можно, но я, все-таки, не вижу в этом ничего хорошего. Так это... я ж привёл пример с кешем. IMemoryCache, любой компонент может повлиять на любой, грохнуть данные по ключам, записать туда мусор. И примеров можно дофига привести. Мы же как-то живём с вилками и ножами, не смотря на всю их смертельную угрозу :) fkthat ще скажи, что ты не слышал про connection pool и во времена ADO.NET делал один общий объект Connection на все приложение. Ну так пул как бы не бесконечный ресурс :) Например, под нагрузками 100-200K rpm и выше, ресурсами не разбрасываются, особенно с необъяснимым выхлопом. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 22:26 |
|
Иньекция DbContext
|
|||
---|---|---|---|
#18+
fkthat hVostt продвинутые пацаны юзают CQ(R)S и на эту тему не парятся :) А CQRS в базу аки спаситель пешком по воде ходит? Так типа ты вообще не тащишь никакой XxxxxContext :) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 22:28 |
|
Иньекция DbContext
|
|||
---|---|---|---|
#18+
hVostt Ну так пул как бы не бесконечный ресурс :) Например, под нагрузками 100-200K rpm и выше, ресурсами не разбрасываются, особенно с необъяснимым выхлопом. Поэтому и best practice это избавляться от соединения как можно быстрее, чтобы оно в пул вернулось, а не тянуть его открытым через весь запрос (впрочем, к ЕФ это отношения не имеет, т.к. у него контекст соединение не держит при себе, а дергает только когда оно надо) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 22:33 |
|
Иньекция DbContext
|
|||
---|---|---|---|
#18+
hVostt Так это... я ж привёл пример с кешем. IMemoryCache, любой компонент может повлиять на любой, грохнуть данные по ключам, записать туда мусор. Это какой-то черезжопный кеш. По нормальному кеш делается тонкой прослойкой декораторов, и его клиент (к примеру, сервис БЛ) прямого доступа туда не имеет. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 22:35 |
|
Иньекция DbContext
|
|||
---|---|---|---|
#18+
fkthat Поэтому и best practice это избавляться от соединения как можно быстрее, чтобы оно в пул вернулось, а не тянуть его открытым через весь запрос (впрочем, к ЕФ это отношения не имеет, т.к. у него контекст соединение не держит при себе, а дергает только когда оно надо) Эти правила как раз применимы к HTTP-запросу. Дальше дробить, это уже ебантяйство какое-то :) fkthat Это какой-то черезжопный кеш. По нормальному кеш делается тонкой прослойкой декораторов, и его клиент (к примеру, сервис БЛ) прямого доступа туда не имеет. Это перпендикулярные вещи совершенно. Добавить кеширующий аспект к запросу это одно, оперировать ключом это другое. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 22:40 |
|
Иньекция DbContext
|
|||
---|---|---|---|
#18+
fkthat, Опять таки "прямого доступа не имеет" -- и вообще закрытый до фанатизма в дупелину БЛ, зачастую являет собой совершенно не сопровождаемое решение, от которого хочется плакать. Не забываем, что кроме уменьшения связанности, нужно думать о хорошей связности. Когда у тебя в проекте 100500 интерфейсов на каждую херню, это уже не смешно. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 22:43 |
|
Иньекция DbContext
|
|||
---|---|---|---|
#18+
hVostt handmadeFromRu ну наверное все ж от задачи и в вебе эт приемлемо. вопрос что если тебе 2 варика надо что придется дописать. меня лично вызывает не понятки что часто делпют репо + Uow поверх орм где по сути также репо и uow. продвинутые пацаны юзают CQ(R)S и на эту тему не парятся :) а как CQRS поможет не шлепать репо и uow? не понимаю ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 22:44 |
|
Иньекция DbContext
|
|||
---|---|---|---|
#18+
fkthat hVostt Ну так пул как бы не бесконечный ресурс :) Например, под нагрузками 100-200K rpm и выше, ресурсами не разбрасываются, особенно с необъяснимым выхлопом. Поэтому и best practice это избавляться от соединения как можно быстрее, чтобы оно в пул вернулось, а не тянуть его открытым через весь запрос (впрочем, к ЕФ это отношения не имеет, т.к. у него контекст соединение не держит при себе, а дергает только когда оно надо) чекал он не держит конекшен открытым. открывает закрывает по запросу. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 22:45 |
|
Иньекция DbContext
|
|||
---|---|---|---|
#18+
hVostt fkthat, Опять таки "прямого доступа не имеет" -- и вообще закрытый до фанатизма в дупелину БЛ, зачастую являет собой совершенно не сопровождаемое решение, от которого хочется плакать. Не забываем, что кроме уменьшения связанности, нужно думать о хорошей связности. Когда у тебя в проекте 100500 интерфейсов на каждую херню, это уже не смешно. Не закрытый БЛ, а прозрачное кеширование, когда БЛ кеша просто не видит. Кеширующий декоратор . И как это вообще связано с кол-вом интерфейсов не пойму. Декоратор он на то и декоратор, что имеет тот же интерфейс, что у декорируемого объекта. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 22:52 |
|
Иньекция DbContext
|
|||
---|---|---|---|
#18+
handmadeFromRu а как CQRS поможет не шлепать репо и uow? не понимаю так у тебя для публики команды и запросы никто в репу не ходит, есть она там и или нет. насчёт uow, по-хорошему нужен, но не обязателен, если структура логики позволяет ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 22:52 |
|
|
start [/forum/topic.php?fid=18&msg=40016665&tid=1354606]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
19ms |
others: | 13ms |
total: | 172ms |
0 / 0 |