|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANA1. Поднимать DbContext в начале запроса, убивать в конце;Чтобы избежать нежелательных распределённых транзакций и иметь возможность возвращать из методов IQueryable, временем жизни контекста лучше управлять через ThreadStatic + счётчик ссылок. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 18:26 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КskyANAпропущено... Вы определение репозитория забыли, или Вы с ним не согласны?Тут с этими определениями кто во что горазд. repository == data access layerRepositoryA Repository mediates between the domain and data mapping layers, acting like an in-memory domain object collection. Client objects construct query specifications declaratively and submit them to Repository for satisfaction. Objects can be added to and removed from the Repository, as they can from a simple collection of objects, and the mapping code encapsulated by the Repository will carry out the appropriate operations behind the scenes. Conceptually, a Repository encapsulates the set of objects persisted in a data store and the operations performed over them, providing a more object-oriented view of the persistence layer. Repository also supports the objective of achieving a clean separation and one-way dependency between the domain and data mapping layers. Алексей КЕсли доступ к данным будет содержать методы вроде GetXXXByID, при реализации слоя логики N+1 неизбежен.Если до конца понимать суть шаблона, то откуда какая-то логика N+1? Если доступ к данным содержит только методы вроде GetXXXByID, то возможноть "Client objects construct query specifications declaratively and submit them to Repository for satisfaction" не реализована. То есть репозиторий тупо не предоставляет тот функционал, что должен (мог бы) предоставлять исходя из определения. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 18:39 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAЕсли доступ к данным содержит только методы вроде GetXXXByID, то возможноть "Client objects construct query specifications declaratively and submit them to Repository for satisfaction" не реализована. System.LINQ.Expression == query specifications следовательно: DbContext == Repository Все эти определения появились до появления LINQ2SQL. С его выходом всё поменялось. Просто не все ещё это заметили. :-) Если кому-то в проекте требуется репозитарий поверх репозитария - я не против. Но мне это не надо. :-) skyANAТо есть репозиторий тупо не предоставляет тот функционал, что должен (мог бы) предоставлять исходя из определения.Зачем реализовывать самому функционал, имеющийся в LINQ2SQL? Велосипедостроение тоже должно иметь разумные пределы. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 18:50 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КskyANAЕсли доступ к данным содержит только методы вроде GetXXXByID, то возможноть "Client objects construct query specifications declaratively and submit them to Repository for satisfaction" не реализована. System.LINQ.Expression == query specifications следовательно: DbContext == Repository Все эти определения появились до появления LINQ2SQL. С его выходом всё поменялось. Просто не все ещё это заметили. :-) Вот так просто взял и нарушил концепцию Persistence Ignorance.RepositoryConceptually, a Repository encapsulates the set of objects persisted in a data store and the operations performed over them, providing a more object-oriented view of the persistence layer. Алексей КЕсли кому-то в проекте требуется репозитарий поверх репозитария - я не против. Но мне это не надо. :-)Кому-то требуется полноценный репозиторий Алексей КskyANAТо есть репозиторий тупо не предоставляет тот функционал, что должен (мог бы) предоставлять исходя из определения.Зачем реализовывать самому функционал, имеющийся в LINQ2SQL? Велосипедостроение тоже должно иметь разумные пределы. :-)Затем, что на прошлой работе данные о забранированном туре были распределены между основным хранилищем системы и конечными точками: поставщиками отелей, перелётов, трансфер, экскурсий и т.п. Интерфейс к основному хранилищу и конечным точкам был единый, а вот реализации разные. И как-то сложно было применять LINQ2SQL к данным в формате XML даже тогда, когда перешли с .Net 2.0 на .Net 3.5. Затем что на текущей работе два хранилища: MS SQL Server и MongoDB, - и MS что-то пока не реализовала EF под MongoDB. А кэшируются они в memcached, что является key-value хранилищем, к которому писать IQueryProvider как-то глупо что-ли. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 19:05 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAАлексей Кпропущено... System.LINQ.Expression == query specifications следовательно: DbContext == Repository Все эти определения появились до появления LINQ2SQL. С его выходом всё поменялось. Просто не все ещё это заметили. :-) Вот так просто взял и нарушил концепцию Persistence Ignorance.RepositoryConceptually, a Repository encapsulates the set of objects persisted in a data store and the operations performed over them, providing a more object-oriented view of the persistence layer. Вроде тоже правильно: авторConceptually, a Repository LINQ DbContext encapsulates the set of objects persisted in a data store and the operations performed over them, providing a more object-oriented view of the persistence layer. skyANAАлексей КЕсли кому-то в проекте требуется репозитарий поверх репозитария - я не против. Но мне это не надо. :-)Кому-то требуется полноценный репозиторий Алексей Кпропущено... Зачем реализовывать самому функционал, имеющийся в LINQ2SQL? Велосипедостроение тоже должно иметь разумные пределы. :-)Затем, что на прошлой работе данные о забранированном туре были распределены между основным хранилищем системы и конечными точками: поставщиками отелей, перелётов, трансфер, экскурсий и т.п. Интерфейс к основному хранилищу и конечным точкам был единый, а вот реализации разные. И как-то сложно было применять LINQ2SQL к данным в формате XML даже тогда, когда перешли с .Net 2.0 на .Net 3.5. Затем что на текущей работе два хранилища: MS SQL Server и MongoDB, - и MS что-то пока не реализовала EF под MongoDB. А кэшируются они в memcached, что является key-value хранилищем, к которому писать IQueryProvider как-то глупо что-ли.Я уже пояснял, что рассматриваю случай с одной SQL БД. Если баз много - там всё очевидно, обсуждать нечего. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 19:24 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КЯ уже пояснял, что рассматриваю случай с одной SQL БД. Если баз много - там всё очевидно, обсуждать нечего.И что? Репозиторий должен обеспечивать работу с данными как с in-memory domain object collection, как бы последние не были распределены. То что Вы при проектировании поддержку этого требования опустили из-за того, что у Вас случай с одной SQL БД, не даёт Вам оснований приравнивать DbContext к репозиторию. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 19:37 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANA,автор на прошлой работе данные о забранированном туре были распределены между основным хранилищем системы и конечными точками: поставщиками отелей, перелётов, трансфер, экскурсий и т.п. Вы что работу поменяли? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 19:56 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAАлексей КЯ уже пояснял, что рассматриваю случай с одной SQL БД. Если баз много - там всё очевидно, обсуждать нечего.И что?И всё. :-) skyANAРепозиторий должен обеспечивать работу с данными как с in-memory domain object collection, как бы последние не были распределены.В DbContext такой API присутствует. skyANAТо что Вы при проектировании поддержку этого требования опустили из-за того, что у Вас случай с одной SQL БД, не даёт Вам оснований приравнивать DbContext к репозиторию. Не понял, где я чего опустил. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 05:56 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КskyANA1. Поднимать DbContext в начале запроса, убивать в конце;Чтобы избежать нежелательных распределённых транзакций и иметь возможность возвращать из методов IQueryable, временем жизни контекста лучше управлять через ThreadStatic + счётчик ссылок. Ужос... А у меня нечерезжопное нормальное решение: репозиторий как IDisposable, где в методе Dispose честно прибивается датаконтекст или иной диспосабельный ресурс. Всё в рамках классики без соплей и гадостей. Алексей КDbContext == Repository В каком-то приближени, да. Но не совсем, т.к. датаконтекст - это реляционное отображение данных БД (ORM), а репозиторий - посредник между уровнями области определения и распределения данных (domain and data mapping layers), используя интерфейс, схожий с коллекциями для доступа к объектам области определения. Алексей КЯ уже пояснял, что рассматриваю случай с одной SQL БД. Если баз много - там всё очевидно, обсуждать нечего. Слушай, ну бизнес так неоднороден и расплывчат, как можно закладываться только под БД? Ну а если сейчас БД, а завтра нужно через веб сервис протащить коллекцию из абаперской RFCFunction? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 09:27 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Где-то в степиВы что работу поменяли?Уже год и десять месяцев как поменял. Ссылка на текущий проект в профиле. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 12:03 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУСлушай, ну бизнес так неоднороден и расплывчат, как можно закладываться только под БД? Ну а если сейчас БД, а завтра нужно через веб сервис протащить коллекцию из абаперской RFCFunction?Алексей КВ DbContext такой API присутствует. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 12:05 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAГде-то в степиВы что работу поменяли?Уже год и десять месяцев как поменял. Ссылка на текущий проект в профиле. мда.., как быстро летит время ((( ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 12:44 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей КЯ уже пояснял, что рассматриваю случай с одной SQL БД. Если баз много - там всё очевидно, обсуждать нечего. Слушай, ну бизнес так неоднороден и расплывчат, как можно закладываться только под БД? Ну а если сейчас БД, а завтра нужно через веб сервис протащить коллекцию из абаперской RFCFunction?А если завтра это будет не нужно? А оно медленно работает уже сегодня. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 13:40 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Зануды... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 13:40 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КА если завтра это будет не нужно? Так я же уже писал про непредсказуемость бизнеса и про то, что ты изначально прибиваешь свою архитектуру жирными гвоздями к доске. Не понимаю смысла в этом. Да еще и какую-то жесть с "ThreadStatic + счётчик ссылок" реализовывать. Алексей КА оно медленно работает уже сегодня. Ты о чем? Что в репозитории работает медленно? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 14:36 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей КА оно медленно работает уже сегодня. Ты о чем? Что в репозитории работает медленно? :)N+1 Мы ходим по кругу. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 15:06 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КМСУпропущено... Ты о чем? Что в репозитории работает медленно? :)N+1 Мы ходим по кругу. :-)То есть у N+1 у вас уже сегодня работает? Или у кого оно работает? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 15:19 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Вообще логика конечно железная: у нас одна БД и завтра ничего не изменится, поэтому и у вас проблем нет и не будет, и не может быть. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 15:25 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAВообще логика конечно железная: у нас одна БД и завтра ничего не изменится, поэтому и у вас проблем нет и не будет, и не может быть. Иногда лучше решать проблемы по мере их поступления. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 15:47 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КskyANAВообще логика конечно железная: у нас одна БД и завтра ничего не изменится, поэтому и у вас проблем нет и не будет, и не может быть. Иногда лучше решать проблемы по мере их поступления.Спасибо КЭП. А иногда полезно думать до и во время проектирования системы и смотреть, что вокруг-то происходит и пользоваться своим и чужим опытом, чтобы избежать лишних проблем. Также полезно внимательно читать, что пишут:Проблемы при использовании шаблона RepositoryКак любой другой шаблон проектирования, Repository имеет множество интерпретаций и реализаций. Вообще, когда речь идет о проектировании, то сложно отделить абсолютно правильное решение от полностью неправильного. Обычно говорят, что всё зависит от ситуации. С другой стороны, в блогах и статьях попадаются решения, в которых авторы нарушают принципы проектирования или предлагают реализации с явными проблемами. Я собрал такие способы использования шаблона Repository, для того чтобы обратить внимание на возможные проблемы их применения. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 16:01 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAА иногда полезно думать до и во время проектирования системы и смотреть, что вокруг-то происходит и пользоваться своим и чужим опытом, чтобы избежать лишних проблем.Главное - иметь своё мнение. И если оно отличается от мнения большинства, это ещё не значит, что оно неправильное. Ну да Бог с ней, с философией... :-) Если по теме - хочется обсудить архитектуру, ориентированную на конкретную СУБД + EF + максимальная производительность. Повторюсь, обсуждать тривиальные вещи, которые нынче модно называть репозитарием, мне не интересно. Там всё очевидно. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 16:11 |
|
|
start [/forum/topic.php?fid=17&msg=38415364&tid=1349917]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
38ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 136ms |
0 / 0 |