|
Подскажите современную реализацию Unit of Work + EF.
|
|||
---|---|---|---|
#18+
В гугле нашел достаточно не мало реализаций паттерна Unit Of Work совместно с EF. Однако статьи предлагают самые разные варианты, и при этом довольно очень очень старые (года этак от 2013). В части встречаемых решений видел код такого вида: Код: c# 1. 2. 3. 4. 5. 6.
Что мне кажется не верным. Транзакция должна уметь окружать несколько последовательных запросов. Ну и другие странности встречались. Поэтому. Подскажите пожалуйста проверенную в боевых условиях реализацию. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 17:48 |
|
Подскажите современную реализацию Unit of Work + EF.
|
|||
---|---|---|---|
#18+
EF, NH - это уже UoW. что Вам не хватает? Транзакции (TransactionScope, как вариант) - это уровень сервисов. можно конечно, например, для веб, весь веб-запрос обернуть в транзакцию. а лучше так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
repository - он только с методом SaveChange, чтобы дернуть базовый UoW (EF, NH) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 21:38 |
|
Подскажите современную реализацию Unit of Work + EF.
|
|||
---|---|---|---|
#18+
UoW - это шире, чем просто обвеска над DAL. с DAL он может быть вообще не связан. а Вы, как мне кажется, пытаетесь "применить паттерн" где он и так есть. это бесполезное занятие ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 21:44 |
|
Подскажите современную реализацию Unit of Work + EF.
|
|||
---|---|---|---|
#18+
Полностью согласен, обвязываем ORM сервисами, инжектируем их в презентеры. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 22:11 |
|
Подскажите современную реализацию Unit of Work + EF.
|
|||
---|---|---|---|
#18+
fsharp_fsharpUoW - это шире, чем просто обвеска над DAL. с DAL он может быть вообще не связан. а Вы, как мне кажется, пытаетесь "применить паттерн" где он и так есть. это бесполезное занятие Не бесполезное, так как базовой функциональности EF может не хватать. Тем более никто не гарантирует, что все 100% бизнес данных будут лежать в одной базе данных и доступной через один контекст EF. Самый банальный пример: прикрепленные файлы, которые не грузятся в БД, а хранятся отдельно, но их сохранение вместо со ссылкой в БД, это единая транзакция. В примерах по-сложнее, данные могут разлетаться по разным СУБД, в монгу, в поисковые индексы и прочее. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2016, 08:18 |
|
Подскажите современную реализацию Unit of Work + EF.
|
|||
---|---|---|---|
#18+
hVostt, тебе ясно намекнули на сервисы. Расширяйся через них. EF - это контекст только конкретной БД, он ничего не должен знать о чем-то другом, о логике, о звездах. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2016, 09:22 |
|
Подскажите современную реализацию Unit of Work + EF.
|
|||
---|---|---|---|
#18+
СмузиhVostt, тебе ясно намекнули на сервисы. Расширяйся через них. EF - это контекст только конкретной БД, он ничего не должен знать о чем-то другом, о логике, о звездах. Всё верно. Но при чём тут твои сервисы? Речь идёт про UOW. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2016, 10:51 |
|
Подскажите современную реализацию Unit of Work + EF.
|
|||
---|---|---|---|
#18+
hVosttВсё верно. Но при чём тут твои сервисы? Речь идёт про UOW. Ты невнимателен. Прочитай еще раз самый первый ответ от fsharp_fsharp. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2016, 11:06 |
|
Подскажите современную реализацию Unit of Work + EF.
|
|||
---|---|---|---|
#18+
СмузиhVosttВсё верно. Но при чём тут твои сервисы? Речь идёт про UOW. Ты невнимателен. Прочитай еще раз самый первый ответ от fsharp_fsharp. На что я должен был обратить внимание? Я перечитал, и всё сказанное мной в силе. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2016, 11:26 |
|
Подскажите современную реализацию Unit of Work + EF.
|
|||
---|---|---|---|
#18+
hVosttНа что я должен был обратить внимание? На то, что EF - и так уже коробочный UoW. Автор хочет расширений, ему говорят расширяться в сервисах. Ты пишешь про какую-то нехватку функциональности EF и о том, что данные могут быть не только в одной БД. Я объясняю, что эта задача покрывается теми же сервисами, оперирующими EF. Ты пишешь "всё верно, но причем тут сервисы". Клиника. P.S. Итог: какой-то свой UoW в задаче не нужен. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2016, 11:50 |
|
Подскажите современную реализацию Unit of Work + EF.
|
|||
---|---|---|---|
#18+
fsharp_fsharpUoW - это шире, чем просто обвеска над DAL. с DAL он может быть вообще не связан. а Вы, как мне кажется, пытаетесь "применить паттерн" где он и так есть. это бесполезное занятие Я застрял вот с чем. На нижнем уровне мы имеем репозитории под каждый тип сущностей. И репозитории находятся в DbContext. Затем, с репозиториями работают сервисы. Сервисов может быть много - не пихать же всю логику в один. И вот работу нескольких сервисов нужно объединить в одну транзакцию. А это снова уровень DbContext.Получается, что DbContext в этой логике появляется дважды. Я нигде еще пока не нашел хорошего примера, где это учитывается: т.е. имеются сервисы, репозитории и работа ведется в рамках транзакции. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2016, 11:52 |
|
Подскажите современную реализацию Unit of Work + EF.
|
|||
---|---|---|---|
#18+
Смузи, Вы конечно все хорошо пишете. Про то, что UOW есть в самом EF. Но вот по транзациям не ясно как быть. Кто их должен стартовать и потом передавать управление сервисам, работающим с репозиториям. Я уж не затрагиваю тестирование и IOC. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2016, 12:16 |
|
Подскажите современную реализацию Unit of Work + EF.
|
|||
---|---|---|---|
#18+
Fungusfsharp_fsharpUoW - это шире, чем просто обвеска над DAL. с DAL он может быть вообще не связан. а Вы, как мне кажется, пытаетесь "применить паттерн" где он и так есть. это бесполезное занятие Я застрял вот с чем. На нижнем уровне мы имеем репозитории под каждый тип сущностей. И репозитории находятся в DbContext. Затем, с репозиториями работают сервисы. Сервисов может быть много - не пихать же всю логику в один. И вот работу нескольких сервисов нужно объединить в одну транзакцию. А это снова уровень DbContext.Получается, что DbContext в этой логике появляется дважды. Я нигде еще пока не нашел хорошего примера, где это учитывается: т.е. имеются сервисы, репозитории и работа ведется в рамках транзакции. если используется один DbContext на все, то можно сделать так: допустим, надо вызвать S3(), состоящий из S1(), S2(), как одну транзакцию 1. Провести декомпозицию туловищ существующих методов S1(), S2() Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
2. Скомпоновать третий - нужный Код: c# 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2016, 12:24 |
|
Подскажите современную реализацию Unit of Work + EF.
|
|||
---|---|---|---|
#18+
FungusВы конечно все хорошо пишете. Про то, что UOW есть в самом EF. Но вот по транзациям не ясно как быть. Кто их должен стартовать и потом передавать управление сервисам, работающим с репозиториям. Я уж не затрагиваю тестирование и IOC. Так тут чистый IoC с сервисами, о кот. говорили ранее. Без IoC ничего не решается. Сервисы в конструкторе принимают EF контекст, который инжектится где-то DI контейнером. Поэтому мы вполне себе можем запустить в одной транзакции 2 куска кода, сидящих в разных сервисах. Потому что экземпляр контекста един, он просто размазывается по нужным сервисам. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2016, 12:33 |
|
Подскажите современную реализацию Unit of Work + EF.
|
|||
---|---|---|---|
#18+
Перегонщик перекупки, Вы предлагаете просто создать еще один сервис, который будет стартовать транзакции и просто вызывать методы других сервисов ? Это решение конечно лежит на поверхности, но где тут разделение на слои ? Потом будет каша в коде, когда не ясно какие сервисы могут стартовать транзакции, какие нет, и кто кого вызывает для реальной работы. В худшем случае получится так, что разные сервисы могут иметь методы стартующие транзакции и вызывающие другие сервисы. И в то же время быть вызываемыми из других сервисов - стартующих ртанзакции. Нет. Так не подходит. UOW нужно четко вынести в отдельный слой. Чтобы только этот слой мог стартовать транзакции и уже вызывать любые сервисы. Вопрос лишь в том, как это реализовать. Как инстанцировать этот класс UOW, как потом инстанцировать сервисы, DBContext и передавать их друг другу (чтобы DBContext был один). Ищу такой вот пример. Но нахожу лишь простейшие реализации с репозиториями без учета транзакций. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2016, 12:39 |
|
Подскажите современную реализацию Unit of Work + EF.
|
|||
---|---|---|---|
#18+
Смузи, Так а транзакцию кто стартует в вашем варианте ? Кто вызывает SaveChanges ? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2016, 12:40 |
|
Подскажите современную реализацию Unit of Work + EF.
|
|||
---|---|---|---|
#18+
FungusТак а транзакцию кто стартует в вашем варианте ? Кто вызывает SaveChanges ? Какой-то из сервисов, к примеру второй. У второго сервиса может быть IoC зависимость на первый сервис. Поэтому, второй сервис стартует транзакцию, вызывает какую-то логику из первого сервиса, потом что-то делает ещё, а потом SaveChanges. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2016, 12:47 |
|
Подскажите современную реализацию Unit of Work + EF.
|
|||
---|---|---|---|
#18+
FungusПерегонщик перекупки, Вы предлагаете просто создать еще один сервис, который будет стартовать транзакции и просто вызывать методы других сервисов ? Это решение конечно лежит на поверхности , но где тут разделение на слои ? что значит где? репо и сервисы так и остались. просто ваш 3-й сервис - это композиция 2-х + какая-то его внутренняя логика. и именно этот 3-й сервис и примет решение о SaveChanges ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2016, 12:54 |
|
Подскажите современную реализацию Unit of Work + EF.
|
|||
---|---|---|---|
#18+
Смузи, Буквально выше ответил Перегонщик перекупки, что ТАКОЙ подход приведет к каше. Получается UOW никак не выделен в отдельный слой. Им может выступать любой сервис. И потом фиг разберешся какие сервисы могут стартовать транзакцию, а какие нет. А потом наступит момент, когда один сервис стуртующий транзакцию должен будет вызывать другой сервис стартующий транзакции - вот тогда начнется полная каша. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2016, 12:54 |
|
Подскажите современную реализацию Unit of Work + EF.
|
|||
---|---|---|---|
#18+
FungusТАКОЙ подход приведет к каше Так и так каша получается. Запускать в одной транзакции методы разных слоёв - дырка в архитектуре. Хочется идеалов - нужно переносить эту логику в один метод. Хочется малой кровью решить текущую проблему - я писал рецепт. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2016, 13:01 |
|
Подскажите современную реализацию Unit of Work + EF.
|
|||
---|---|---|---|
#18+
СмузиНа то, что EF - и так уже коробочный UoW. Автор хочет расширений, ему говорят расширяться в сервисах. Ты пишешь про какую-то нехватку функциональности EF и о том, что данные могут быть не только в одной БД. Я объясняю, что эта задача покрывается теми же сервисами, оперирующими EF. Ты пишешь "всё верно, но причем тут сервисы". Клиника. UOW в EF не является UOW в рамках всего приложения. Бизнес-транзакционность не обеспечивается, поэтому: СмузиP.S. Итог: какой-то свой UoW в задаче не нужен. Свой UOW нужен. Но если у тебя задачи настолько примитивные, что всё замыкается на одной единственной БД, то может быть ты и прав. Но давай не будем рассматривать настоящие задачи, которые стоят перед разработчиками через призму твоих маленьких полустуденческих решений, ок? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2016, 13:09 |
|
Подскажите современную реализацию Unit of Work + EF.
|
|||
---|---|---|---|
#18+
hVosttUOW в EF не является UOW в рамках всего приложения EF является UOW в любых рамках, окнах и дверях. А как ты будешь инжектировать его - совсем другой вопрос. Как это делать, выше озвучил. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2016, 13:14 |
|
Подскажите современную реализацию Unit of Work + EF.
|
|||
---|---|---|---|
#18+
СмузиEF является UOW в любых рамках, окнах и дверях. А как ты будешь инжектировать его - совсем другой вопрос. Как это делать, выше озвучил. Ты начинаешь играться с терминами, это означает, что по существу сказать тебе толком нечего. Да контекст EF реализует паттерн UOW, и его может вполне хватить для маленького учебного проекта. В реальных проектах нужен свой UOW, так как рамки транзакции приложения могут быть гораздо шире, чем транзакция одной БД. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2016, 13:22 |
|
Подскажите современную реализацию Unit of Work + EF.
|
|||
---|---|---|---|
#18+
hVostt, У вас есть идеи того, как разбить работу с DbContext на репозитории и сервисы и перекрыть это транзакциями ? Если вы говорите, что в EF уже есть UOW, вы предлагаете не реализовывать его отдельным слоем? Как тогда предполагается работа сервисов - напрямую дерганьем DbSet'ов единственного контекста ? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2016, 13:31 |
|
|
start [/forum/topic.php?fid=20&fpage=45&tid=1399948]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
57ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
others: | 317ms |
total: | 486ms |
0 / 0 |