powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Иньекция DbContext
25 сообщений из 98, страница 3 из 4
Иньекция DbContext
    #40016509
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Да и, как я уже писал, вызывать DAL прямо из контроллера это уже сама по себе хрень какая-то.


Это не DAL, это UOW. UOW может реализовывать не только SaveChanges в DbContext-а, но выполнять любые другие завершающие операции: отправка сообщений в очередь, инициация событий, сохранение данных в другие репозитории.

Мыслить рамками, что DbContext это абсолютно вся работа с данными что есть -- вредно.
Это не так.

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


Именно является. Как я уже сказал, это UOW. Проблема в твоих рассуждениях, что ты за DbContext видишь какой-то маленький кусочек, но не видишь остального.

Ну и проблемы прям люто надуманные. Я не представляю что можно сделать, чтобы контекст в скоупе было плохим решением. Это надо ещё постараться. Ну и это признак явного говнокодища :)
...
Рейтинг: 0 / 0
Иньекция DbContext
    #40016510
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
Ну вот смотри (как я расшифровываю подход Хвоста), само название Db Context делает его похожим на артефакты типа HttpContext и иже с ним. То есть вот у тебя запрос, он же скоуп, на него формируется HttpContext, DbContext еще какие-то контексты. Каждый из сервисов может модифицировать что-то в этом контексте, но закрытие и финальное решение по этим контекстам происходит именно в момент окончания работы со скоупом, ну в данном случае - это последние команды контроллера.


Всё верно.

Просто со времён развития идеи fat controller is evil, люди ушли в другую крайность, которая ещё хуже, чем жирные контроллеры.

Именно контроллер отвечает за правильную организацию обработки запроса. От слова контроллер же!
...
Рейтинг: 0 / 0
Иньекция DbContext
    #40016512
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
А если он где-то в фильтре используется, или в middleware?


И что? Не вижу никаких проблем. В фильтре или в миддлеваре вообще нужно избегать работы с DbContext. И действовать через разумные абстракции.
...
Рейтинг: 0 / 0
Иньекция DbContext
    #40016519
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
В фильтре или в миддлеваре вообще нужно избегать работы с DbContext. И действовать через разумные абстракции.

А я и не сказал, что напрямую использовать. Он может использоваться через какой-либо сервис BL.

hVostt
Именно контроллер отвечает за правильную организацию обработки запроса. От слова контроллер же!

Контроллер отвечает за трансляцию HTTP-запроса в вызов сервиса(ов) BL и трансляцию ответа от BL в HTTP-ответ. Знать что-то о том, что лежит ниже BL он не имеет права.
...
Рейтинг: 0 / 0
Иньекция DbContext
    #40016533
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
В фильтре или в миддлеваре вообще нужно избегать работы с DbContext. И действовать через разумные абстракции.

А я и не сказал, что напрямую использовать. Он может использоваться через какой-либо сервис BL.


Ну фиг знает, может у тебя фильтр для записи в БД лога запросов.
И отсюда растут ноги у проблемы :)

Конечно, так делать нельзя, DbContext для таких задач не предназначен.

fkthat
Контроллер отвечает за трансляцию HTTP-запроса в вызов сервиса(ов) BL и трансляцию ответа от BL в HTTP-ответ. Знать что-то о том, что лежит ниже BL он не имеет права.


А он и не знает. Не вижу никаких противоречий
...
Рейтинг: 0 / 0
Иньекция DbContext
    #40016539
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt

Ну фиг знает, может у тебя фильтр для записи в БД лога запросов.
И отсюда растут ноги у проблемы :)
ьзя, DbContext для таких задач не предназначен.

У меня такого фильтра нет, я из ума не выжил, но я тут говорю о модульности. Я вызываю сервис, который писал вообще не я. Я не знаю и знать не хочу про него ничего, кроме того, что у него должно быть на входе (параметры) и на выходе (возвращаемое значение). А тут оказывается, что этот сервис втайне от меня изменяет окружение (DbContext) вообще всего что только можно, что в моем скоупе. Бог даже с ним с DbContext. Замени его на любой синглтон (или на скоупед, что тот же синглтон и есть, только для контекста), состояние которого кто угодно может поменять, и будет то же самое. Именно это мне и не нравится.
...
Рейтинг: 0 / 0
Иньекция DbContext
    #40016589
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
А тут оказывается, что этот сервис втайне от меня изменяет окружение (DbContext) вообще всего что только можно


ПОГОДИ!
А если _этот сервис_ в тайне от тебя в БД что-то пишет?
Что тогда?
При чём тут тогда DbContext? :)

И что он там такого может _изменить_, что повлияет на тебя? Я просто не понимаю. Это что вообще он там может такого сделать?

fkthat
Замени его на любой синглтон (или на скоупед, что тот же синглтон и есть, только для контекста), состояние которого кто угодно может поменять, и будет то же самое. Именно это мне и не нравится.


Всё же хотелось бы более приземлённых примеров, в области практики.
Мне на самом деле в архитектуре .NET, библиотек и решений много чего не нравится.
Я даже не представляю что должно случиться, чтобы мне всё-всё нравилось :)

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


Надо как-то немного конкретней выделить проблему.
...
Рейтинг: 0 / 0
Иньекция DbContext
    #40016613
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
А если _этот сервис_ в тайне от тебя в БД что-то пишет?

Так пусть себе и пишет. Суть в том, что все при этом должно быть сделано так, чтобы меня, как потребителя этого сервиса это не волновало. Ты пользуешься кучей .NET API - а вдруг оно тоже что-то там куда-то пишет, что ты не знаешь - тебя это просто не волнует и все, т.к. оно если и пишет, то делает это так, что тебя не трогает.
...
Рейтинг: 0 / 0
Иньекция DbContext
    #40016626
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Так пусть себе и пишет. Суть в том, что все при этом должно быть сделано так, чтобы меня, как потребителя этого сервиса это не волновало. Ты пользуешься кучей .NET API - а вдруг оно тоже что-то там куда-то пишет, что ты не знаешь - тебя это просто не волнует и все, т.к. оно если и пишет, то делает это так, что тебя не трогает.


Ну давай тогды IMemoryCache тоже сделаем транзиентным

Как я уже говорил, от общего DbContext в скоупе есть реальный профит. Именно так он рекомендуется к использованию. Теоретически это тоже объясняется одним предложением: DbContext это UOW.

Какие-то надуманные и высосанные из пальца проблемы, якобы кто-то другой в мой контекст влезет и что-то там сломает на практике совершенно не подтверждаются. Проект, который построен на EF уже по факту обладает довольно высокой связностью.

Давай я пример ещё приведу.
У тебя есть приложение на EF с контекстом.
Ты решил добавить себе фоновые службы, вынес в отдельное сервисное приложение, как полагается.
Взял хенгфаер.

Теперь зырь: https://github.com/sergezhigunov/Hangfire.EntityFrameworkCore

Намекаю на то, что задачи Hangfire никак не пересекаются с задачами твоего DbContext.
Значит это другой контекст.

И ещё намекаю, раз у тебя в рамках одного DbContext реализуются совершенно не связанные задачи и разнесённая на пару парсеков логика, значит у тебя явно нарушение SRP и ты пытаешься вылечить зрение через ж-пу :)
...
Рейтинг: 0 / 0
Иньекция DbContext
    #40016634
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
И ещё намекаю, раз у тебя в рамках одного DbContext реализуются совершенно не связанные задачи и разнесённая на пару парсеков логика, значит у тебя явно нарушение SRP и ты пытаешься вылечить зрение через ж-пу :)

Ага. Под каждый сервис БЛ будем заводить отдельный контекст и БД. Да что уж там - давай под каждый метод сервиса отдельный контекст.

Одна из идей севиса (компонента) это инкапсуляция, что значит, что он не должен никак взаимодействовать со "внешним миром" кроме как через свой интерфейс-контракт. Если он начинает менять какие-то объекты, которые разделяет с другими сервисами, то это уже нарушение инкапсуляции. Неспроста ведь глобальные переменные, а также out, и ref параметры считаются говнокодом (ну, кроме Try-Get шаблона, может быть). Ровно по той же причине. Меня вообще доставляет, когда я регулярно вижу, как всё подряд, не глядя регают в контейнере как singleton или scoped - байты, блин экономят, что ли.
...
Рейтинг: 0 / 0
Иньекция DbContext
    #40016640
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,

В упор не вижу, как нарушается инкапсуляция DbContext-а. Это ведь итак уже абстракция. Итак контракт. Давай ещё каждый отдельный компонент ЕДИНОГО приложения будет содержать свой драйвер БД, свой пул соединений, свою файловую систему, каждому классу по отдельной плашке памяти и т.д. и т.п. :)

Вот сколько мы дискутируем, я так и не увидел ни одного хоть отдалённо приближенному к границам реальности кейса, где была обнаружена проблема, которую ты решаешь :)

fkthat
Меня вообще доставляет, когда я регулярно вижу, как всё подряд, не глядя регают в контейнере как singleton или scoped - байты, блин экономят, что ли.


А почему нет? Вот у меня добрый десяток _изолированных_ компонентов используют DbContext в одном HTTP запросе. Мне что на обработку запроса десяток соединений к одной и той же БД создавать?

Инженерия это прежде всего компромисс. Все шаблоны и принципы -- это борьба со сложностью, а не религия.
...
Рейтинг: 0 / 0
Иньекция DbContext
    #40016644
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну наверное все ж от задачи и в вебе эт приемлемо. вопрос что если тебе 2 варика надо что придется дописать.

меня лично вызывает не понятки что часто делпют репо + Uow поверх орм где по сути также репо и uow.
...
Рейтинг: 0 / 0
Иньекция DbContext
    #40016645
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRu
ну наверное все ж от задачи и в вебе эт приемлемо. вопрос что если тебе 2 варика надо что придется дописать.

меня лично вызывает не понятки что часто делпют репо + Uow поверх орм где по сути также репо и uow.


продвинутые пацаны юзают CQ(R)S и на эту тему не парятся :)
...
Рейтинг: 0 / 0
Иньекция DbContext
    #40016646
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
В упор не вижу, как нарушается инкапсуляция DbContext-а.

Да никак она не нарушается. Я уже сто раз повторил. Просто один компонент может влиять на поведение другого через data context. Жить с этим можно, но я, все-таки, не вижу в этом ничего хорошего.

hVostt
Мне что на обработку запроса десяток соединений к одной и той же БД создавать?

Еще скажи, что ты не слышал про connection pool и во времена ADO.NET делал один общий объект Connection на все приложение.
...
Рейтинг: 0 / 0
Иньекция DbContext
    #40016647
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
продвинутые пацаны юзают CQ(R)S и на эту тему не парятся :)

А CQRS в базу аки спаситель пешком по воде ходит?
...
Рейтинг: 0 / 0
Иньекция DbContext
    #40016656
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Просто один компонент может влиять на поведение другого через data context. Жить с этим можно, но я, все-таки, не вижу в этом ничего хорошего.


Так это... я ж привёл пример с кешем. IMemoryCache, любой компонент может повлиять на любой, грохнуть данные по ключам, записать туда мусор. И примеров можно дофига привести.

Мы же как-то живём с вилками и ножами, не смотря на всю их смертельную угрозу :)

fkthat
ще скажи, что ты не слышал про connection pool и во времена ADO.NET делал один общий объект Connection на все приложение.


Ну так пул как бы не бесконечный ресурс :)
Например, под нагрузками 100-200K rpm и выше, ресурсами не разбрасываются, особенно с необъяснимым выхлопом.
...
Рейтинг: 0 / 0
Иньекция DbContext
    #40016657
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
продвинутые пацаны юзают CQ(R)S и на эту тему не парятся :)

А CQRS в базу аки спаситель пешком по воде ходит?


Так типа ты вообще не тащишь никакой XxxxxContext :)
...
Рейтинг: 0 / 0
Иньекция DbContext
    #40016659
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Ну так пул как бы не бесконечный ресурс :)
Например, под нагрузками 100-200K rpm и выше, ресурсами не разбрасываются, особенно с необъяснимым выхлопом.

Поэтому и best practice это избавляться от соединения как можно быстрее, чтобы оно в пул вернулось, а не тянуть его открытым через весь запрос (впрочем, к ЕФ это отношения не имеет, т.к. у него контекст соединение не держит при себе, а дергает только когда оно надо)
...
Рейтинг: 0 / 0
Иньекция DbContext
    #40016660
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Так это... я ж привёл пример с кешем. IMemoryCache, любой компонент может повлиять на любой, грохнуть данные по ключам, записать туда мусор.

Это какой-то черезжопный кеш. По нормальному кеш делается тонкой прослойкой декораторов, и его клиент (к примеру, сервис БЛ) прямого доступа туда не имеет.
...
Рейтинг: 0 / 0
Иньекция DbContext
    #40016662
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Поэтому и best practice это избавляться от соединения как можно быстрее, чтобы оно в пул вернулось, а не тянуть его открытым через весь запрос (впрочем, к ЕФ это отношения не имеет, т.к. у него контекст соединение не держит при себе, а дергает только когда оно надо)


Эти правила как раз применимы к HTTP-запросу. Дальше дробить, это уже ебантяйство какое-то :)


fkthat
Это какой-то черезжопный кеш. По нормальному кеш делается тонкой прослойкой декораторов, и его клиент (к примеру, сервис БЛ) прямого доступа туда не имеет.


Это перпендикулярные вещи совершенно. Добавить кеширующий аспект к запросу это одно, оперировать ключом это другое.
...
Рейтинг: 0 / 0
Иньекция DbContext
    #40016664
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,

Опять таки "прямого доступа не имеет" -- и вообще закрытый до фанатизма в дупелину БЛ, зачастую являет собой совершенно не сопровождаемое решение, от которого хочется плакать.

Не забываем, что кроме уменьшения связанности, нужно думать о хорошей связности.

Когда у тебя в проекте 100500 интерфейсов на каждую херню, это уже не смешно.
...
Рейтинг: 0 / 0
Иньекция DbContext
    #40016665
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
handmadeFromRu
ну наверное все ж от задачи и в вебе эт приемлемо. вопрос что если тебе 2 варика надо что придется дописать.

меня лично вызывает не понятки что часто делпют репо + Uow поверх орм где по сути также репо и uow.


продвинутые пацаны юзают CQ(R)S и на эту тему не парятся :)

а как CQRS поможет не шлепать репо и uow? не понимаю
...
Рейтинг: 0 / 0
Иньекция DbContext
    #40016666
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
Ну так пул как бы не бесконечный ресурс :)
Например, под нагрузками 100-200K rpm и выше, ресурсами не разбрасываются, особенно с необъяснимым выхлопом.

Поэтому и best practice это избавляться от соединения как можно быстрее, чтобы оно в пул вернулось, а не тянуть его открытым через весь запрос (впрочем, к ЕФ это отношения не имеет, т.к. у него контекст соединение не держит при себе, а дергает только когда оно надо)

чекал он не держит конекшен открытым. открывает закрывает по запросу.
...
Рейтинг: 0 / 0
Иньекция DbContext
    #40016669
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
fkthat,

Опять таки "прямого доступа не имеет" -- и вообще закрытый до фанатизма в дупелину БЛ, зачастую являет собой совершенно не сопровождаемое решение, от которого хочется плакать.

Не забываем, что кроме уменьшения связанности, нужно думать о хорошей связности.

Когда у тебя в проекте 100500 интерфейсов на каждую херню, это уже не смешно.

Не закрытый БЛ, а прозрачное кеширование, когда БЛ кеша просто не видит. Кеширующий декоратор . И как это вообще связано с кол-вом интерфейсов не пойму. Декоратор он на то и декоратор, что имеет тот же интерфейс, что у декорируемого объекта.
...
Рейтинг: 0 / 0
Иньекция DbContext
    #40016670
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRu
а как CQRS поможет не шлепать репо и uow? не понимаю


так у тебя для публики команды и запросы
никто в репу не ходит, есть она там и или нет.

насчёт uow, по-хорошему нужен, но не обязателен, если структура логики позволяет
...
Рейтинг: 0 / 0
25 сообщений из 98, страница 3 из 4
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Иньекция DbContext
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]