|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
День добрый! Возник намедни такой вопрос. Есть у меня реализация репозитория: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Используется Constructor Injection: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Как правильно делать, каждый раз создавать новый экземпляр SomeEntityRepository или чтобы один раз создался и IoC-контейнер возвращал созданный при первом обращении? Насколько вообще хорошая практика хранить в контейнере экземпляры в единственном числе? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.03.2015, 17:08 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
xxxTIMxxxКак правильно делатьОт приложения зависит. В большинстве случаев контейнеру указывают, чтобы создавал один экземпляр на поток, или запрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.03.2015, 18:06 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
xxxTIMxxxКак правильно делать...DbContext так же должен инжектироваться контейнером + совет от skyANA. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2015, 05:20 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
xxxTIMxxxНасколько вообще хорошая практика хранить в контейнере экземпляры в единственном числе? Плохая практика. Создаёшь контекст, делаешь че надо, убиваешь контекст. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2015, 05:48 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
hVosttxxxTIMxxxНасколько вообще хорошая практика хранить в контейнере экземпляры в единственном числе? Плохая практика. Создаёшь контекст, делаешь че надо, убиваешь контекст.И таскаешь его параметром методов между сервисами. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2015, 06:04 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
Алексей КИ таскаешь его параметром методов между сервисами. Ето как? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2015, 08:30 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
hVosttАлексей КИ таскаешь его параметром методов между сервисами. Ето как?Это видимо какая-то своя реализация Unit of Work. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2015, 09:03 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
skyANAЭто видимо какая-то своя реализация Unit of Work. Не понятно как ето таскать параметром методов. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2015, 09:16 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
hVosttskyANAЭто видимо какая-то своя реализация Unit of Work. Не понятно как ето таскать параметром методов.А я понял как, у нас в старом г-коде тоже много где встречается: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
Мы это г. активно рефакторим. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2015, 09:39 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
hVosttАлексей КИ таскаешь его параметром методов между сервисами. Ето как?Если в разных методах понадобится один контекст. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2015, 10:44 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
skyANAhVosttпропущено... Не понятно как ето таскать параметром методов.А я понял как, у нас в старом г-коде тоже много где встречается: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
Мы это г. активно рефакторим.Да. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2015, 10:44 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
skyANAА я понял как, у нас в старом г-коде тоже много где встречается: Алексей КЕсли в разных методах понадобится один контекст. А, ну я так и подумал, передавать зависимость ручками. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2015, 10:58 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
Алексей КhVosttпропущено... Ето как?Если в разных методах понадобится один контекст.1. Для этого не обязательно его передавать в параметрах метода; 2. Ты кстати можешь оценить насколько часто может "понадобится один контекст в разных методах"? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2015, 11:03 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
skyANAАлексей Кпропущено... Если в разных методах понадобится один контекст.1. Для этого не обязательно его передавать в параметрах метода;Ну я и предложил вынести его на уровень класса и подсовывать снаружи диконтейнером. skyANA2. Ты кстати можешь оценить насколько часто может "понадобится один контекст в разных методах"?У меня часто, у остальных - не знаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2015, 11:05 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
Алексей КskyANAпропущено... 1. Для этого не обязательно его передавать в параметрах метода;Ну я и предложил вынести его на уровень класса и подсовывать снаружи диконтейнером.Через конструктор, свойство, как? Алексей КskyANA2. Ты кстати можешь оценить насколько часто может "понадобится один контекст в разных методах"?У меня часто, у остальных - не знаю.больше 50%? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2015, 11:08 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
skyANAАлексей Кпропущено... Ну я и предложил вынести его на уровень класса и подсовывать снаружи диконтейнером.Через конструктор, свойство, как?Конструктор, свойство - как больше нравится, как умеет диконтейнер. skyANAАлексей Кпропущено... У меня часто, у остальных - не знаю.больше 50%?Достаточно часто, чтобы не таскать в параметрах. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2015, 11:14 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
Алексей КskyANAпропущено... Через конструктор, свойство, как?Конструктор, свойство - как больше нравится, как умеет диконтейнер. skyANAпропущено... больше 50%?Достаточно часто, чтобы не таскать в параметрах.Понятно, вообщем как у нас. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2015, 11:50 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
Алексей К, а зачем ты вообще это написал: 17362427 ? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2015, 11:54 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
skyANAАлексей К, а зачем ты вообще это написал: 17362427 ?Потому что это приведёт к случаю, пример которого ты привёл. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2015, 12:36 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
hVosttxxxTIMxxxНасколько вообще хорошая практика хранить в контейнере экземпляры в единственном числе? Плохая практика. Создаёшь контекст, делаешь че надо, убиваешь контекст. Т.е. и сервис должен создаваться каждый раз новый? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2015, 13:05 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
xxxTIMxxxhVosttпропущено... Плохая практика. Создаёшь контекст, делаешь че надо, убиваешь контекст. Т.е. и сервис должен создаваться каждый раз новый? да, конечно. если операции повторяющиеся часто, можно организовать пул. в простейшем варианте можно хранить сервисы и контекст, но лучше сразу избавляться от такого подхода, будет слегка сложнее, но в итоге гораздо меньше боли. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2015, 13:44 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
xxxTIMxxxhVosttпропущено... Плохая практика. Создаёшь контекст, делаешь че надо, убиваешь контекст. Т.е. и сервис должен создаваться каждый раз новый?Зависит от архитектуры. Например, если это веб-приложение, то удобно привязывать время жизни сервисов и DbContext к http-запросу. Но об этом уже было сказано. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2015, 14:42 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
Алексей КЗависит от архитектуры. Например, если это веб-приложение, то удобно привязывать время жизни сервисов и DbContext к http-запросу. Но об этом уже было сказано. А если не веб? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2015, 15:07 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
hVostt, А разве большая разница веб или не веб? Там по-моему вообще один фиг разница, на UI не это завязано. А цикл жизни объекта определается вне зависимости от этого. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2015, 15:10 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
AxeleronhVostt, А разве большая разница веб или не веб? Там по-моему вообще один фиг разница, на UI не это завязано. А цикл жизни объекта определается вне зависимости от этого. Так к чему привязывать, если нет Http-запросов? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2015, 15:13 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
hVosttAxeleronhVostt, А разве большая разница веб или не веб? Там по-моему вообще один фиг разница, на UI не это завязано. А цикл жизни объекта определается вне зависимости от этого. Так к чему привязывать, если нет Http-запросов? К событиям? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2015, 15:14 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
hVosttАлексей КЗависит от архитектуры. Например, если это веб-приложение, то удобно привязывать время жизни сервисов и DbContext к http-запросу. Но об этом уже было сказано. А если не веб?С WCF-ным сервером тоже самое. А если десктоп, то сейчас придёт МСУ и скажет, что двухзвенка - зло! Но можно попробовать врукопашную управлять областями контейнера , может даже привязать это к событиям десктопного приложения вроде Idle. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2015, 15:18 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
AxeleronhVosttпропущено... Так к чему привязывать, если нет Http-запросов? К событиям?При асинхронном взаимодействием десктопного приложения с сервером, что в наше время считается "хорошим тоном", это может оказаться не так просто. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2015, 15:20 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
AxeleronК событиям? Скорее, к действиям пользователя, тогда когда есть определённая операция с данными. Алексей КС WCF-ным сервером тоже самое. А если десктоп, то сейчас придёт МСУ и скажет, что двухзвенка - зло! Не-не, рассматривается 2-х звенка, а не зло там она или не зло )) Алексей КНо можно попробовать врукопашную управлять областями контейнера , может даже привязать это к событиям десктопного приложения вроде Idle. Ну вот об этом и речь, в http вся понятно, железно привязываться к запросу, это логично, удобно и понятно. А к чему привязывать lifetime scope без контекста запроса? Алексей КПри асинхронном взаимодействием десктопного приложения с сервером, что в наше время считается "хорошим тоном", это может оказаться не так просто. Ну это разные потоки, не проблема, пока хотя бы для одного клиента. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2015, 15:35 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
hVostt, Ну как-то так для асинхронного: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
В WPF, возможно, прикладной код можно упростить выносом получения области на уровень реализации ICommand. Повторюсь, при синхронном выполнении в UI-потоке можно попробовать привязать уничтожение области к событию Idle, но я бы не стал устраивать такие ограничения. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2015, 15:55 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
hVosttАлексей КЗависит от архитектуры. Например, если это веб-приложение, то удобно привязывать время жизни сервисов и DbContext к http-запросу. Но об этом уже было сказано. А если не веб?К потоку. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2015, 20:46 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
skyANAhVosttпропущено... А если не веб?К потоку.К какому? При продолжении через I/O Completion Port потоков много. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2015, 05:57 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
Алексей КskyANAпропущено... К потоку.К какому? При продолжении через I/O Completion Port потоков много. Видимо имеется в виду основной поток приложения. Пока не вижу смысла стыковаться к потоку. В зависимости от задачи, время жизни сервиса для выполнения некоего действия (бизнес-операции) должно быть сопоставимо с началом и окончанием этой операции. Допустим, открываем большую форму редактирования, для всей формы создаётся контекст, в рамках которого живут полученные сервисы. При сохранении выполняется пакетное сохранение данных контекста, при отмене контекст просто убивается и всё. Я делал так, но и приложения для десктопа не были достаточно сложными, применялись те же принципы, что и в веб, только вместо веб-запроса использовалась концепция операции (связанная, обычно, с командой). Т.е. контекст долго не жил. Там, где требовались табличные данные (гриды, деревья, списки), использовалось кеширование с подкачкой данных через создаваемый для этих целей контектс. Под контекстом имеется в виду не DbContext, а абстракция типа HttpContext-а, только для бизнес-операции, контекст создавался со своим life time scope, умервщлялся убийством scope вместе со всеми своими зависимостями. Сложная операция может порождать подконтексты по тому же принципу. От большого контекста на поток отказался сразу. Всё, что жило в памяти, это кеш и оперативные данные (на самом деле просто живущие как синглетоны в контейнере). ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2015, 08:09 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
hVosttАлексей Кпропущено... К какому? При продолжении через I/O Completion Port потоков много. Видимо имеется в виду основной поток приложения. Пока не вижу смысла стыковаться к потоку. В зависимости от задачи, время жизни сервиса для выполнения некоего действия (бизнес-операции) должно быть сопоставимо с началом и окончанием этой операции. Допустим, открываем большую форму редактирования, для всей формы создаётся контекст, в рамках которого живут полученные сервисы. При сохранении выполняется пакетное сохранение данных контекста, при отмене контекст просто убивается и всё. Я делал так, но и приложения для десктопа не были достаточно сложными, применялись те же принципы, что и в веб, только вместо веб-запроса использовалась концепция операции (связанная, обычно, с командой). Т.е. контекст долго не жил. Там, где требовались табличные данные (гриды, деревья, списки), использовалось кеширование с подкачкой данных через создаваемый для этих целей контектс. Под контекстом имеется в виду не DbContext, а абстракция типа HttpContext-а, только для бизнес-операции, контекст создавался со своим life time scope, умервщлялся убийством scope вместе со всеми своими зависимостями. Сложная операция может порождать подконтексты по тому же принципу. От большого контекста на поток отказался сразу. Всё, что жило в памяти, это кеш и оперативные данные (на самом деле просто живущие как синглетоны в контейнере).на примере StructureMap: http://docs.structuremap.net/Scoping.htm Имелись в виду пункты 6 и 3. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2015, 08:56 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
hVosttприменялись те же принципы, что и в вебВ веб же какой основной принцип? Выполнил команду, закрой соединение и верни его в пул, т.к. в большинстве случаев все работают под одной учёткой, в одном application domain, в одном процессе. В десктопе же у пользователя свой личный пул и играть с ним в пинг-понг не имеет особого смысла. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2015, 09:13 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
skyANAhVosttприменялись те же принципы, что и в вебВ веб же какой основной принцип? Выполнил команду, закрой соединение и верни его в пул, т.к. в большинстве случаев все работают под одной учёткой, в одном application domain, в одном процессе. В десктопе же у пользователя свой личный пул и играть с ним в пинг-понг не имеет особого смысла. А ещё есть мысли кроме идеи «десктоп это не веб»? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2015, 09:57 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
hVosttskyANAпропущено... В веб же какой основной принцип? Выполнил команду, закрой соединение и верни его в пул, т.к. в большинстве случаев все работают под одной учёткой, в одном application domain, в одном процессе. В десктопе же у пользователя свой личный пул и играть с ним в пинг-понг не имеет особого смысла. А ещё есть мысли кроме идеи «десктоп это не веб»?Мысли насчёт чего? Вот ты ещё какие "принципы, что и в веб" можешь озвучить и на чём они основаны? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2015, 10:22 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
skyANAМысли насчёт чего? Вот ты ещё какие "принципы, что и в веб" можешь озвучить и на чём они основаны? Я же озвучил, в веб удобно ограничивать конекст http запросом потому, что обычно запрос является атомарной операцией, приложение строится на этом принципе, если конечно не удерживать состояние на сервере. У десктопного приложения есть основной поток, и он является единственным основным потоком до момента закрытия приложения. Привязываемся к этому потоку? По сути это значит, делать контекст синглетоном, и всё тут. Или ты имел в виду что-то другое? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2015, 15:12 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
hVosttskyANAМысли насчёт чего? Вот ты ещё какие "принципы, что и в веб" можешь озвучить и на чём они основаны? Я же озвучил, в веб удобно ограничивать конекст http запросом потому, что обычно запрос является атомарной операцией, приложение строится на этом принципе, если конечно не удерживать состояние на сервере. У десктопного приложения есть основной поток, и он является единственным основным потоком до момента закрытия приложения. Привязываемся к этому потоку? По сути это значит, делать контекст синглетоном, и всё тут. Или ты имел в виду что-то другое?Насчёт DbContext не скажу (с EF не работал), а вот держать открытое соединение (DbConnection) - это вполне себе нормально. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2015, 17:29 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
skyANAНасчёт DbContext не скажу (с EF не работал), а вот держать открытое соединение (DbConnection) - это вполне себе нормально. Соединение это совсем другое. EF DbContext эт чистый UOW практически, исходя из этого я спрашивал, есть ли другие широко известные способы работы с ним. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2015, 19:11 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
hVosttskyANAНасчёт DbContext не скажу (с EF не работал), а вот держать открытое соединение (DbConnection) - это вполне себе нормально. Соединение это совсем другое. EF DbContext эт чистый UOW практически, исходя из этого я спрашивал, есть ли другие широко известные способы работы с ним.Хорошо, давай разбираться. UoW нужен для того, чтобы отслеживать действия над объектами (создание, изменение, удаление) и выполнять соответсвующие запросы (INSERT, UPDATE, DELETE) во время Commit (или Flush, или что там в EF). В ADO.NET он реализован где? Правильно, в DataSet. И вот тебе самый, что ни на есть "широко известные способы работы с ним" :) Также UoW тесно связан с бизнес-транзакциями, это да. Но не обязательно одна бизнесс-транзакция == один объект, реализующий UoW. На том же DataSet можно показать, что выполнили пачку каких-то действий, вызвали DataAdapter.Update(DataSet dataSet) и DataSet.AcceptChanges() . И продолжаем работать дальше. И в случае NHibernate сделали Flush и продолжаем работать дальше. И в EF думаю можно также. Ну и lifecycle сервиса != lifecycle UoW. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2015, 07:47 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
hVosttДопустим, открываем большую форму редактирования, для всей формы создаётся контекст, в рамках которого живут полученные сервисы. При сохранении выполняется пакетное сохранение данных контекста, при отмене контекст просто убивается и всё.Вот тут надо задуматься, а выполнит ли контейнер Release сразу при закрытии формы. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2015, 07:56 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
skyANAТакже UoW тесно связан с бизнес-транзакциями, это да. Но не обязательно одна бизнесс-транзакция == один объект, реализующий UoW. Вообще-то говоря, желательно, так как в рамках одного объекта, реализующего UoW отслеживаются все изменения и взаимосвязи данных, коммит сохраняет полное состояние операции. Если объектов будет больше, теоретически может возникнуть несогласованное состояние. skyANAВ ADO.NET он реализован где? Правильно, в DataSet. И вот тебе самый, что ни на есть "широко известные способы работы с ним" :) Я бы с натяжечкой DataSet включал в ADO.NET ) Скорее, это средство работы с ним. skyANAИ в случае NHibernate сделали Flush и продолжаем работать дальше. И в EF думаю можно также. Ну и lifecycle сервиса != lifecycle UoW. В общем, да. Но что происходит в NHibernate, если Flush выполнить не удалось? База данных не пропустила. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2015, 09:44 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
skyANAВот тут надо задуматься, а выполнит ли контейнер Release сразу при закрытии формы. Честно говоря без разницы, сразу будет Release или чуть позже, это ни на что не влияет, так как мы выходим из scope. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2015, 09:46 |
|
EF + Repository + DI
|
|||
---|---|---|---|
#18+
hVosttskyANAТакже UoW тесно связан с бизнес-транзакциями, это да. Но не обязательно одна бизнесс-транзакция == один объект, реализующий UoW. Вообще-то говоря, желательно, так как в рамках одного объекта, реализующего UoW отслеживаются все изменения и взаимосвязи данных, коммит сохраняет полное состояние операции. Если объектов будет больше, теоретически может возникнуть несогласованное состояние.Я не верно выразился. Надо читать так: не обязательно одна бизнесс-транзакция == новый объект, реализующий UoW :) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2015, 12:59 |
|
|
start [/forum/topic.php?all=1&fid=17&tid=1349607]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
172ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
77ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 307ms |
0 / 0 |