powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Подскажите современную реализацию Unit of Work + EF.
25 сообщений из 96, страница 1 из 4
Подскажите современную реализацию Unit of Work + EF.
    #39352107
Fungus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В гугле нашел достаточно не мало реализаций паттерна Unit Of Work совместно с EF. Однако статьи предлагают самые разные варианты, и при этом довольно очень очень старые (года этак от 2013).

В части встречаемых решений видел код такого вида:

Код: c#
1.
2.
3.
4.
5.
6.
public virtual void Update(T entity)
    {
        dbSet.Attach(entity);
        _unitOfWork.Db.Entry(entity).State = EntityState.Modified;
        this._unitOfWork.Db.SaveChanges();
    }



Что мне кажется не верным. Транзакция должна уметь окружать несколько последовательных запросов. Ну и другие странности встречались.
Поэтому. Подскажите пожалуйста проверенную в боевых условиях реализацию.
...
Рейтинг: 0 / 0
Подскажите современную реализацию Unit of Work + EF.
    #39352262
fsharp_fsharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EF, NH - это уже UoW. что Вам не хватает?
Транзакции (TransactionScope, как вариант) - это уровень сервисов. можно конечно, например, для веб, весь веб-запрос обернуть в транзакцию. а лучше так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
//тут вызов в TransactionScope, который коммитом не закончится, если исключение
[Transaction] //АОП
void SaveSome(Some some)
{
     //проверка безнес логики - не прошла - кастомный эксепшн (типо контракт)
     ....
     someRepository.Save(entity) 
     repository.SaveChange();//и тут тоже может быть ексепшн, пипа конкурентный доступ и пр.
}



repository - он только с методом SaveChange, чтобы дернуть базовый UoW (EF, NH)
...
Рейтинг: 0 / 0
Подскажите современную реализацию Unit of Work + EF.
    #39352269
fsharp_fsharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UoW - это шире, чем просто обвеска над DAL. с DAL он может быть вообще не связан. а Вы, как мне кажется, пытаетесь "применить паттерн" где он и так есть. это бесполезное занятие
...
Рейтинг: 0 / 0
Подскажите современную реализацию Unit of Work + EF.
    #39352277
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Полностью согласен, обвязываем ORM сервисами, инжектируем их в презентеры.
...
Рейтинг: 0 / 0
Подскажите современную реализацию Unit of Work + EF.
    #39352383
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fsharp_fsharpUoW - это шире, чем просто обвеска над DAL. с DAL он может быть вообще не связан. а Вы, как мне кажется, пытаетесь "применить паттерн" где он и так есть. это бесполезное занятие

Не бесполезное, так как базовой функциональности EF может не хватать. Тем более никто не гарантирует, что все 100% бизнес данных будут лежать в одной базе данных и доступной через один контекст EF. Самый банальный пример: прикрепленные файлы, которые не грузятся в БД, а хранятся отдельно, но их сохранение вместо со ссылкой в БД, это единая транзакция. В примерах по-сложнее, данные могут разлетаться по разным СУБД, в монгу, в поисковые индексы и прочее.
...
Рейтинг: 0 / 0
Подскажите современную реализацию Unit of Work + EF.
    #39352406
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt, тебе ясно намекнули на сервисы. Расширяйся через них. EF - это контекст только конкретной БД, он ничего не должен знать о чем-то другом, о логике, о звездах.
...
Рейтинг: 0 / 0
Подскажите современную реализацию Unit of Work + EF.
    #39352454
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СмузиhVostt, тебе ясно намекнули на сервисы. Расширяйся через них. EF - это контекст только конкретной БД, он ничего не должен знать о чем-то другом, о логике, о звездах.

Всё верно. Но при чём тут твои сервисы? Речь идёт про UOW.
...
Рейтинг: 0 / 0
Подскажите современную реализацию Unit of Work + EF.
    #39352464
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttВсё верно. Но при чём тут твои сервисы? Речь идёт про UOW.
Ты невнимателен. Прочитай еще раз самый первый ответ от fsharp_fsharp.
...
Рейтинг: 0 / 0
Подскажите современную реализацию Unit of Work + EF.
    #39352498
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СмузиhVosttВсё верно. Но при чём тут твои сервисы? Речь идёт про UOW.
Ты невнимателен. Прочитай еще раз самый первый ответ от fsharp_fsharp.

На что я должен был обратить внимание? Я перечитал, и всё сказанное мной в силе.
...
Рейтинг: 0 / 0
Подскажите современную реализацию Unit of Work + EF.
    #39352522
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttНа что я должен был обратить внимание?
На то, что EF - и так уже коробочный UoW. Автор хочет расширений, ему говорят расширяться в сервисах. Ты пишешь про какую-то нехватку функциональности EF и о том, что данные могут быть не только в одной БД. Я объясняю, что эта задача покрывается теми же сервисами, оперирующими EF. Ты пишешь "всё верно, но причем тут сервисы". Клиника.

P.S. Итог: какой-то свой UoW в задаче не нужен.
...
Рейтинг: 0 / 0
Подскажите современную реализацию Unit of Work + EF.
    #39352526
Fungus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fsharp_fsharpUoW - это шире, чем просто обвеска над DAL. с DAL он может быть вообще не связан. а Вы, как мне кажется, пытаетесь "применить паттерн" где он и так есть. это бесполезное занятие

Я застрял вот с чем. На нижнем уровне мы имеем репозитории под каждый тип сущностей. И репозитории находятся в DbContext. Затем, с репозиториями работают сервисы. Сервисов может быть много - не пихать же всю логику в один. И вот работу нескольких сервисов нужно объединить в одну транзакцию. А это снова уровень DbContext.Получается, что DbContext в этой логике появляется дважды. Я нигде еще пока не нашел хорошего примера, где это учитывается: т.е. имеются сервисы, репозитории и работа ведется в рамках транзакции.
...
Рейтинг: 0 / 0
Подскажите современную реализацию Unit of Work + EF.
    #39352549
Fungus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Смузи,

Вы конечно все хорошо пишете. Про то, что UOW есть в самом EF. Но вот по транзациям не ясно как быть. Кто их должен стартовать и потом передавать управление сервисам, работающим с репозиториям.
Я уж не затрагиваю тестирование и IOC.
...
Рейтинг: 0 / 0
Подскажите современную реализацию Unit of Work + EF.
    #39352554
Перегонщик перекупки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
private s1()
private s2()

[Transaction]
public S1()
{
     s1()
}

[Transaction]
public S1()
{
     s2()
}



2. Скомпоновать третий - нужный
Код: c#
1.
2.
3.
4.
5.
6.
7.
[Transaction]
public S3()
{
     s1()
     s2()
    //наверняка тут будет какая-то своя логика, которой не было в s1() и s2()
}
...
Рейтинг: 0 / 0
Подскажите современную реализацию Unit of Work + EF.
    #39352566
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FungusВы конечно все хорошо пишете. Про то, что UOW есть в самом EF. Но вот по транзациям не ясно как быть. Кто их должен стартовать и потом передавать управление сервисам, работающим с репозиториям.
Я уж не затрагиваю тестирование и IOC.
Так тут чистый IoC с сервисами, о кот. говорили ранее. Без IoC ничего не решается. Сервисы в конструкторе принимают EF контекст, который инжектится где-то DI контейнером. Поэтому мы вполне себе можем запустить в одной транзакции 2 куска кода, сидящих в разных сервисах. Потому что экземпляр контекста един, он просто размазывается по нужным сервисам.
...
Рейтинг: 0 / 0
Подскажите современную реализацию Unit of Work + EF.
    #39352578
Fungus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Перегонщик перекупки,

Вы предлагаете просто создать еще один сервис, который будет стартовать транзакции и просто вызывать методы других сервисов ? Это решение конечно лежит на поверхности, но где тут разделение на слои ? Потом будет каша в коде, когда не ясно какие сервисы могут стартовать транзакции, какие нет, и кто кого вызывает для реальной работы.
В худшем случае получится так, что разные сервисы могут иметь методы стартующие транзакции и вызывающие другие сервисы. И в то же время быть вызываемыми из других сервисов - стартующих ртанзакции.

Нет. Так не подходит. UOW нужно четко вынести в отдельный слой. Чтобы только этот слой мог стартовать транзакции и уже вызывать любые сервисы. Вопрос лишь в том, как это реализовать. Как инстанцировать этот класс UOW, как потом инстанцировать сервисы, DBContext и передавать их друг другу (чтобы DBContext был один). Ищу такой вот пример. Но нахожу лишь простейшие реализации с репозиториями без учета транзакций.
...
Рейтинг: 0 / 0
Подскажите современную реализацию Unit of Work + EF.
    #39352581
Fungus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Смузи,

Так а транзакцию кто стартует в вашем варианте ? Кто вызывает SaveChanges ?
...
Рейтинг: 0 / 0
Подскажите современную реализацию Unit of Work + EF.
    #39352591
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FungusТак а транзакцию кто стартует в вашем варианте ? Кто вызывает SaveChanges ?
Какой-то из сервисов, к примеру второй. У второго сервиса может быть IoC зависимость на первый сервис. Поэтому, второй сервис стартует транзакцию, вызывает какую-то логику из первого сервиса, потом что-то делает ещё, а потом SaveChanges.
...
Рейтинг: 0 / 0
Подскажите современную реализацию Unit of Work + EF.
    #39352602
Перегонщик перекупки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FungusПерегонщик перекупки,

Вы предлагаете просто создать еще один сервис, который будет стартовать транзакции и просто вызывать методы других сервисов ? Это решение конечно лежит на поверхности , но где тут разделение на слои ?

что значит где? репо и сервисы так и остались. просто ваш 3-й сервис - это композиция 2-х + какая-то его внутренняя логика. и именно этот 3-й сервис и примет решение о SaveChanges
...
Рейтинг: 0 / 0
Подскажите современную реализацию Unit of Work + EF.
    #39352603
Fungus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Смузи,

Буквально выше ответил Перегонщик перекупки, что ТАКОЙ подход приведет к каше. Получается UOW никак не выделен в отдельный слой. Им может выступать любой сервис. И потом фиг разберешся какие сервисы могут стартовать транзакцию, а какие нет. А потом наступит момент, когда один сервис стуртующий транзакцию должен будет вызывать другой сервис стартующий транзакции - вот тогда начнется полная каша.
...
Рейтинг: 0 / 0
Подскажите современную реализацию Unit of Work + EF.
    #39352612
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FungusТАКОЙ подход приведет к каше
Так и так каша получается. Запускать в одной транзакции методы разных слоёв - дырка в архитектуре. Хочется идеалов - нужно переносить эту логику в один метод. Хочется малой кровью решить текущую проблему - я писал рецепт.
...
Рейтинг: 0 / 0
Подскажите современную реализацию Unit of Work + EF.
    #39352628
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СмузиНа то, что EF - и так уже коробочный UoW. Автор хочет расширений, ему говорят расширяться в сервисах. Ты пишешь про какую-то нехватку функциональности EF и о том, что данные могут быть не только в одной БД. Я объясняю, что эта задача покрывается теми же сервисами, оперирующими EF. Ты пишешь "всё верно, но причем тут сервисы". Клиника.

UOW в EF не является UOW в рамках всего приложения. Бизнес-транзакционность не обеспечивается, поэтому:


СмузиP.S. Итог: какой-то свой UoW в задаче не нужен.

Свой UOW нужен.

Но если у тебя задачи настолько примитивные, что всё замыкается на одной единственной БД, то может быть ты и прав. Но давай не будем рассматривать настоящие задачи, которые стоят перед разработчиками через призму твоих маленьких полустуденческих решений, ок?
...
Рейтинг: 0 / 0
Подскажите современную реализацию Unit of Work + EF.
    #39352640
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttUOW в EF не является UOW в рамках всего приложения
EF является UOW в любых рамках, окнах и дверях. А как ты будешь инжектировать его - совсем другой вопрос. Как это делать, выше озвучил.
...
Рейтинг: 0 / 0
Подскажите современную реализацию Unit of Work + EF.
    #39352651
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СмузиEF является UOW в любых рамках, окнах и дверях. А как ты будешь инжектировать его - совсем другой вопрос. Как это делать, выше озвучил.

Ты начинаешь играться с терминами, это означает, что по существу сказать тебе толком нечего. Да контекст EF реализует паттерн UOW, и его может вполне хватить для маленького учебного проекта. В реальных проектах нужен свой UOW, так как рамки транзакции приложения могут быть гораздо шире, чем транзакция одной БД.
...
Рейтинг: 0 / 0
Подскажите современную реализацию Unit of Work + EF.
    #39352663
Fungus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt,

У вас есть идеи того, как разбить работу с DbContext на репозитории и сервисы и перекрыть это транзакциями ?

Если вы говорите, что в EF уже есть UOW, вы предлагаете не реализовывать его отдельным слоем? Как тогда предполагается работа сервисов - напрямую дерганьем DbSet'ов единственного контекста ?
...
Рейтинг: 0 / 0
Подскажите современную реализацию Unit of Work + EF.
    #39352687
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttВ реальных проектах нужен свой UOW, так как рамки транзакции приложения могут быть гораздо шире, чем транзакция одной БД.
Приведи пример.
...
Рейтинг: 0 / 0
25 сообщений из 96, страница 1 из 4
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Подскажите современную реализацию Unit of Work + EF.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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