|
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?fid=17&msg=38900770&tid=1349607]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
149ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 261ms |
total: | 505ms |
0 / 0 |