|
Передача data context по иерархии конструкторов - надо, нет?
|
|||
---|---|---|---|
#18+
Создаю я модель сложную - в этом участвуют несколько конструкторов. Коллеции ей заполняю, поля. Что лучше, создать один data context и передавать его вниз по конструкторам составляющих объектов, или в каждом конструторе свой контекст создавать? Для простого примера, от балды накидал код: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36.
Так вот, лучше так, как в коде, или лучше в самом верхнем по вызову конструкторе создать один раз и передавать через параметр в конструкторы ниже по иерархии вызовов? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2013, 16:51 |
|
Передача data context по иерархии конструкторов - надо, нет?
|
|||
---|---|---|---|
#18+
Так в конструкторе класса С ошибка, но пофиг - главное, я про констекст спрашиваю. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2013, 16:53 |
|
Передача data context по иерархии конструкторов - надо, нет?
|
|||
---|---|---|---|
#18+
Советуют поменьше давать жить контексту. Буквально, по контексту на транзакцию. Я желание есть, чтобы раз создать контекст при старте приложения и удалять его только при закрывании приложения. Я вот что думаю. Если приложение работает с локальной БД, только для одного юзера, то можно, пожалуй, и один контекст на всё приложение шарить. А если много юзеров и серверная БД - уже чем меньше контекст живёт, тем лучше (тем меньше вероятность конкуренций и связанными с ней накладными расходами). Я правильно думаю? Но вот в данном конрктеном случае, при каскаде инициализаций, достаточно же вроде одного контекста, который лучше передавать в параметрах конктрукторов? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2013, 16:58 |
|
Передача data context по иерархии конструкторов - надо, нет?
|
|||
---|---|---|---|
#18+
Что такое "модель сложная" и на фига ей какой-то контекст? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2013, 17:10 |
|
Передача data context по иерархии конструкторов - надо, нет?
|
|||
---|---|---|---|
#18+
skyANAЧто такое "модель сложная" и на фига ей какой-то контекст? Я под этим подразумеваю, что её поля (модель - это класс) состоят из других типов, из коллекций этих типов и т. д. И при инициализации экземпляра модели сначала происходит инициализация экземпляров составляющих её типов, а затем её самой (это я назвал каскадной инициализацией). И каждый такой экземпляр инициализируется данными из БД. Эти данные берутся не прямо из БД, а череp энтитифреймворковское ORM, с которым я общаюсь через контекст данных (DBContext). Этот контекст - "типа БД", только в виде кода. Т. е. я работаю не с БД, а с контекстом. И вот я спрашиваю, один контекст создавать на такие каскадные инициализации (и, соответстввенно, передавать его в конструкторы составляющих типов), или создавать свои контексты по месту каждой конкретной инициализации? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2013, 19:40 |
|
Передача data context по иерархии конструкторов - надо, нет?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2013, 19:41 |
|
Передача data context по иерархии конструкторов - надо, нет?
|
|||
---|---|---|---|
#18+
user7320, Имхо, тут все зависит от приложения, если данные получаются только для чтения, с натяжкой почему бы нет, будет работать и жить с экземпляром, но если подразумевается модификация данных в экземплярах классов, тут может возникнуть неразбериха так как контекст это же и кеш первого уровня и замыкатель единицы работы ( грязный или чистый объект), имхо для этого дела держать одни контекст а классы создавать через фабрику di/ioc, а концы контекста выкинуть через интерфейс типов создаваемых или изолировать его через прокси методы. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2013, 20:19 |
|
Передача data context по иерархии конструкторов - надо, нет?
|
|||
---|---|---|---|
#18+
user7320skyANAЧто такое "модель сложная" и на фига ей какой-то контекст? Я под этим подразумеваю, что её поля (модель - это класс) состоят из других типов, из коллекций этих типов и т. д. И при инициализации экземпляра модели сначала происходит инициализация экземпляров составляющих её типов, а затем её самой (это я назвал каскадной инициализацией). И каждый такой экземпляр инициализируется данными из БД. Эти данные берутся не прямо из БД, а череp энтитифреймворковское ORM, с которым я общаюсь через контекст данных (DBContext). Этот контекст - "типа БД", только в виде кода. Т. е. я работаю не с БД, а с контекстом. И вот я спрашиваю, один контекст создавать на такие каскадные инициализации (и, соответстввенно, передавать его в конструкторы составляющих типов), или создавать свои контексты по месту каждой конкретной инициализации?Какой-то ActiveRecord на базе EF получается. ИМХО редко, кто сейчас так в .NET делает. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2013, 22:18 |
|
Передача data context по иерархии конструкторов - надо, нет?
|
|||
---|---|---|---|
#18+
user7320 The primary class that is responsible for interacting with data as objects is System.Data.Entity.DbContext (often referred to as context). Разобрались? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2013, 22:37 |
|
Передача data context по иерархии конструкторов - надо, нет?
|
|||
---|---|---|---|
#18+
skyANAuser7320пропущено... Я под этим подразумеваю, что её поля (модель - это класс) состоят из других типов, из коллекций этих типов и т. д. И при инициализации экземпляра модели сначала происходит инициализация экземпляров составляющих её типов, а затем её самой (это я назвал каскадной инициализацией). И каждый такой экземпляр инициализируется данными из БД. Эти данные берутся не прямо из БД, а череp энтитифреймворковское ORM, с которым я общаюсь через контекст данных (DBContext). Этот контекст - "типа БД", только в виде кода. Т. е. я работаю не с БД, а с контекстом. И вот я спрашиваю, один контекст создавать на такие каскадные инициализации (и, соответстввенно, передавать его в конструкторы составляющих типов), или создавать свои контексты по месту каждой конкретной инициализации?Какой-то ActiveRecord на базе EF получается. ИМХО редко, кто сейчас так в .NET делает. Почему ActiveRecord-то? У меня данные только считываются, но не обновляются (поэтому мне, кстати, лучше там выше, в коде, использоваться РидОнлиКоллекшн... ну да ладно). Я это, кстати, забыл упомянуть - не думал, что это важно. Где-то в степиuser7320, Имхо, тут все зависит от приложения, если данные получаются только для чтения, с натяжкой почему бы нет, будет работать и жить с экземпляром, но если подразумевается модификация данных в экземплярах классов, тут может возникнуть неразбериха так как контекст это же и кеш первого уровня и замыкатель единицы работы ( грязный или чистый объект), имхо для этого дела держать одни контекст а классы создавать через фабрику di/ioc, а концы контекста выкинуть через интерфейс типов создаваемых или изолировать его через прокси методы. Я тут репозиторий и единицу работы даже не это самое... не делаю. А данные да - только для чтения. Я просто формирую большую сложную модель, чтобы потом в представлении (ASP.NET MVC) раскидать её поля по разным местам. Я вообще про сам принцип - в таком варианте, когда чтобы инициализировать класс, надо инициализировать сначала другие классы, которые от включает в себя в качестве полей, лучше пользоваться одним контекстом и передавать его по цепочке инициализаций, чем на каждом этапе инициализации создавать свой контекст? Это же кажется разумным? А если будет куча контекстов - во-первых, для чего? А во-вторых - даже если надо будет модификацию данных делать, то при многих контекстах внутри одного сложного объекта как раз и могут возникнуть всякие проблемы и неразберихи. Например, синхронизация одновременно существующих нескольких контекстов, каждый из которых содержит изменения своей части сложного объекта. Вот тогда-то и нужны единицы работы и репозиторий, а так-то, когда просто чтение - чего заморачиваться. Да? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2013, 22:51 |
|
Передача data context по иерархии конструкторов - надо, нет?
|
|||
---|---|---|---|
#18+
user7320, переходим по Вашей же ссылке и читаем:some general guidelines when deciding on the lifetime of the context - When working with Web applications, use a context instance per request Если не хотите заморачиваться, то создайте контекст, засуньте его в HttpContext.Current.Items и используйте. Когда вдруг понадобиться использовать классы модели в другом месте, тогда и перепишете. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2013, 23:07 |
|
Передача data context по иерархии конструкторов - надо, нет?
|
|||
---|---|---|---|
#18+
skyANAuser7320 The primary class that is responsible for interacting with data as objects is System.Data.Entity.DbContext (often referred to as context). Разобрались? А, кстати, да. Что-то забыл - там внизу рекомендации. Ну, как я и думал - нефиг для атомарных операций по контексту создавать - слишком жирно и не зачем. Собственно, создание такого сложного объекта, что я выше описал, и есть один запрос, после которого я отдаю через контроллер этот объект в представление и всё - контекст можно убивать. Можно считать, что разобрался. Тогда мой код выше должен выглядеть так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2013, 23:18 |
|
Передача data context по иерархии конструкторов - надо, нет?
|
|||
---|---|---|---|
#18+
user7320, да для на фига тут вообще какие-то свои классы и контексты? Храните свой сложный объект в MongoDB и отдавайте как BsonDocument прямиком в представление. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2013, 23:31 |
|
Передача data context по иерархии конструкторов - надо, нет?
|
|||
---|---|---|---|
#18+
skyANAuser7320, да для на фига тут вообще какие-то свои классы и контексты? Храните свой сложный объект в MongoDB и отдавайте как BsonDocument прямиком в представление. Я кроме СКЛ Сервера ничего не знаю и пока (пока!) знать не хочу. У меня ещё голова не выросла, чтобы столько вмещать. Да и это не относится к теме вопроса - я же не спрашиваю, какая вообще СУБД лучше, а спрашиваю, какой вариант при имеющихся вводных лучше. Кстати, не нашёл в Википедии (как русской, так и английской) отрицательных сторон подхода MongoDB. А из жизненного опыта известно, что если что-то не имеет отрицательных сторон (является этакой серебряной пулей), то очень скоро полностью все должны перейте на это. Но я что-то не вижу засилье MongoDB. И это в наш-то век связей и мгновенной передачи новостей ("Э, слыш, Вась, а Монго-то круче всех! Бросай этот Скул Сервер нафиг!"). ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2013, 00:22 |
|
Передача data context по иерархии конструкторов - надо, нет?
|
|||
---|---|---|---|
#18+
user7320, не нравится 1 тяжелая инициализация в конструкторе , гораздо прагматичней инициализация по требованию 2 куча запросов бомбит сервер имхо не осмысленно. проще сделать наследование c:ZZ и вытащить все одним джойном,( ну тут надо смотреть структуру) 3 не желание применять фабрику и инжекции Да и вообще все не нравится вплоть до названий полей и классов ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2013, 00:38 |
|
Передача data context по иерархии конструкторов - надо, нет?
|
|||
---|---|---|---|
#18+
user7320Да и это не относится к теме вопроса - я же не спрашиваю, какая вообще СУБД лучше, а спрашиваю, какой вариант при имеющихся вводных лучше.Изначально вводных почти и не было. Только теперь понятно, что это веб и только чтение. Я бы использовал Dapper ( performance of SELECT mapping ), и уж точно бы не стал так жёстко связывать модель с DBContext. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2013, 08:10 |
|
Передача data context по иерархии конструкторов - надо, нет?
|
|||
---|---|---|---|
#18+
Все зависит от того, что собой представляет твой контекст и какой тип приложения. Если у тебя в контексте пара свойств и пара коллекций и приложение ASP.NET, то генерить контекст на каждом чихе юзера в принципе нормальная практика. Если у тебя толстый клиент и в контексте пол сотни коллекций с сущностями из БД, то генерить такой контекст на каждом чихе юзера мягко говоря не рационально. Плюс если например у тебя WPF или Silverlight, то постоянная генерация контекста сводит на нет весь смысл механизма привязок. Поэтому в таких случаях создаем на старте один контекст в котором периодически обновляем данные из БД или от куда-то еще. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2013, 08:52 |
|
Передача data context по иерархии конструкторов - надо, нет?
|
|||
---|---|---|---|
#18+
EDUARD SAPOTSKIв котором периодически обновляем данные из БД или от куда-то еще.А откуда ещё EF может "обновлять данные"? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2013, 09:02 |
|
Передача data context по иерархии конструкторов - надо, нет?
|
|||
---|---|---|---|
#18+
skyANAEDUARD SAPOTSKIв котором периодически обновляем данные из БД или от куда-то еще.А откуда ещё EF может "обновлять данные"? А где ТС про EF говорил? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2013, 09:28 |
|
Передача data context по иерархии конструкторов - надо, нет?
|
|||
---|---|---|---|
#18+
EDUARD SAPOTSKIskyANAпропущено... А откуда ещё EF может "обновлять данные"? А где ТС про EF говорил? 14879525 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2013, 09:48 |
|
Передача data context по иерархии конструкторов - надо, нет?
|
|||
---|---|---|---|
#18+
EDUARD SAPOTSKI, а Вы что под контекстом понимаете в своём посте выше? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2013, 09:51 |
|
Передача data context по иерархии конструкторов - надо, нет?
|
|||
---|---|---|---|
#18+
skyANAа Вы что под контекстом понимаете в своём посте выше? Честно говоря так до конца и не понял что ТС имеет ввиду под контекстом, хоть и перечитал его пост три раза, в моем понимании контекст это набор бизнес-сущностей которыми оперирует приложение. Браться они могут из БД, из веб-сервисов, хоть из текстового файла, не суть... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2013, 09:59 |
|
Передача data context по иерархии конструкторов - надо, нет?
|
|||
---|---|---|---|
#18+
skyANAuser7320Да и это не относится к теме вопроса - я же не спрашиваю, какая вообще СУБД лучше, а спрашиваю, какой вариант при имеющихся вводных лучше.Изначально вводных почти и не было. Только теперь понятно, что это веб и только чтение. Я бы использовал Dapper ( performance of SELECT mapping ), и уж точно бы не стал так жёстко связывать модель с DBContext. Нет, это опять советы с выходом из обсуждаемой темы, с предложением сторонних средств. Я за производительностью сейчас не гонюсь. Вот Где-то в степи правильно начал говорить - по сути. EDUARD SAPOTSKI, вы так говорите, будто мой контекст уже содержит в себе все данные БД. На сколько я знаю, поначалу он вообще как бы пустой и содержит в себе в основном "схему БД" в терминах языка программирования (классы там и прочее). Думаю, даже если генерить такую схему, отображающую полсотни таблиц, на каждом чихе, затраты не будут большими. Если я не гонюсь за оптимизациями, то и так сойдёт. В конце концов, на первом месте стоит быстрота разработки и удобство поддержки и развития кода, а не сверхскорость его исполнения. Иначе я бы не выбрал .NET, а выбрал какой-нибудь С или С++. Где-то в степи автор1 тяжелая инициализация в конструкторе, гораздо прагматичней инициализация по требованию А если я сделаю конструктор по-умолчанию без инициализаций и конструктор с параметром контекста БД, куда и буду передавать этот контекст, созданный раньше, вне конструктора (а, например, в коде, его, конструктор, вызывающем)? автор2 куча запросов бомбит сервер имхо не осмысленно. проще сделать наследование c:ZZ и вытащить все одним джойном,( ну тут надо смотреть структуру) Ну, может, и можно вытащить. Только у меня модель не обязательно повторяет структуру связей в БД. Так что если и получится вытащить джойном, то не всё. Я так думаю. С другой стороны, опять же про "бомбить" - так ли уж важно, один раз джойном я обращусь к БД, или три раза простым запросом? Велика разница? Снова стоит учесть, что у меня не высоконагруженный сервис и я не гонюсь за производительностью в первую очередь. автор3 не желание применять фабрику и инжекции А я о них только слышал. Я ещё не настолько развит, чтобы сразу прямо так знать, где и куда что из паттернов применить можно. Приведите, пожалуйста, пример, или дайте ссылку, как бы тут, в моём случае, можно было бы применить фабрику или инжекции. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2013, 10:09 |
|
Передача data context по иерархии конструкторов - надо, нет?
|
|||
---|---|---|---|
#18+
EDUARD SAPOTSKIskyANAа Вы что под контекстом понимаете в своём посте выше? Честно говоря так до конца и не понял что ТС имеет ввиду под контекстом, хоть и перечитал его пост три раза, в моем понимании контекст это набор бизнес-сущностей которыми оперирует приложение. Браться они могут из БД, из веб-сервисов, хоть из текстового файла, не суть... Контекст - в терминах EF, как по ссылке было сказано. Т. е. класс, DBContext, экземпляры которого, собственно, и являются "как бы БД" для моего кода. Я его использую как репозиторий. По-моему, для простых проектов нормальный такой репозиторий. Во всяком случае, свой, находящийся по возможностям хотя бы близко к EF, я бы не написал. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2013, 10:12 |
|
Передача data context по иерархии конструкторов - надо, нет?
|
|||
---|---|---|---|
#18+
авторА если я сделаю конструктор по-умолчанию без инициализаций и конструктор с параметром контекста БД, куда и буду передавать этот контекст, созданный раньше, вне конструктора (а, например, в коде, его, конструктор, вызывающем)? Я хотел сказать, что если я сделаю как договорились и дочитались выше - создам контекст в начале запроса и буду его передавать всяким конструкторам, которым он нужен? Так и советуют в той статье про EF. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2013, 10:21 |
|
|
start [/forum/topic.php?fid=17&fpage=23&tid=1349921]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
50ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
115ms |
get tp. blocked users: |
2ms |
others: | 11ms |
total: | 226ms |
0 / 0 |