powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / IRepository как пользоваться
25 сообщений из 238, страница 4 из 10
IRepository как пользоваться
    #38414625
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttони просто говорят о репозитории, который является и в то же время моделью.
Я плакал...
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414628
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAпропущено...
А много ты знаешь НЕ реляционных хранилищ, что поддерживают запросы в каком-либо виде? А для каких из них реализованы LINQ провайдеры?

P.S.: плюс данные могут браться и не из нашего хранилища, а запрашиваться со сторонних сервисов (наших партнёров, публичных и т.п.).Речь идёт о реализации логики к одной SQL базе. Понятно, что если баз много или они не-SQL, IQueryable тут вряд ли пригодится.Бизнес имеет тенденцию расширяться, если он конечно успешный. Сегодня база одна, а завтра...

Наверняка многие, кто пользуется вашими сервисами, имеют при этом свою локальную SQL базу.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414629
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КhVosttпропущено...


они просто говорят о репозитории, который является и в то же время моделью. модель (в понимании MVC), даже близко не является репозиторием, она его использует. это видимо и есть N+1 в вашем понимании.Я о том, что такой подход приведёт к необходимости множества методов типа GetMyEntityByID(int id) , что в свою очередь приведёт к N+1. IQueryable избавляет от этой напасти.

Это ещё фигня. Представьте, что есть сущность Resource. А есть с десяток наследников типа ArticleResource, NewsResource, CatalogResource, ProductResource, ProfileResource... И пускай тот веселый тру-архитектор уделается выдавая IEnumerable на каждую сущность. С IQueryable<T> это решается легко. OfType хорошо работает. И не лишает поведения, реализованного для для базового Resource. То же самое со спецификациями, легко наследуются и прикручиваются. В результате кода меньше во много раз, профит тот же.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414636
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУhVosttони просто говорят о репозитории, который является и в то же время моделью.
Я плакал...
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414637
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAИ кстати люди постоянно забывают, что репозиторий призван скрыть от нас то, как распредены данные.Если мы готовы к "N+1", можно и скрыть. Всё зависит от задачи.Вы определение репозитория забыли, или Вы с ним не согласны?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414638
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КЯ о том, что такой подход приведёт к необходимости множества методов типа GetMyEntityByID(int id) , что в свою очередь приведёт к N+1. IQueryable избавляет от этой напасти.
Так отдавай сразу весь дата контекст, он тебе и так прокидывает все таблицы и вьюхи как IQueryable.
В GetMyEntityByID есть один большой плюс, кода больше, но весь код структирован и как на ладони. Легкость в сопровождении такого кода, простота и очевидность в рефакторинге, внятное документирование. А то, что у тебя потребители могут выкручивать базу как хотят - приводит только к анархии со всеми вытекающими.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414639
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КhVosttпропущено...


они просто говорят о репозитории, который является и в то же время моделью. модель (в понимании MVC), даже близко не является репозиторием, она его использует. это видимо и есть N+1 в вашем понимании.Я о том, что такой подход приведёт к необходимости множества методов типа GetMyEntityByID(int id) , что в свою очередь приведёт к N+1. IQueryable избавляет от этой напасти.Не приведёт.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414640
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
Я о том, что такой подход приведёт к необходимости множества методов типа GetMyEntityByID(int id) , что в свою очередь приведёт к N+1. IQueryable избавляет от этой напасти.Не приведёт.

вы с МСУ похоже не догоняете о чем говорит Алексей...
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414642
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttskyANAпропущено...
Не приведёт.

вы с МСУ похоже не догоняете о чем говорит Алексей...Объясни своими словами.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414648
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Just UserПрошу помощи.
Начал разбираться с репозитариями... На сайте вроде всё красиво описывают, но в реале у меня не работает.
Подскажите ,что делаю не так.
Имеется база данных на SQLExpress.
1. В проект добавил edmx сформировав его на основе базы данных.
2. Описал абстрактный интерфейс
3. Написал реализацию репозитария:
Код: 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.
namespace Model.Concrete
{
    public class ФиктивныйГруппыRepositorty : IКустыRepository
    {
        //Фиктивный жестко закодированный список групп
        private static IQueryable<Кусты> ФиктивныеГруппы = new List<Группы>
        {
            new Группы {ID=1, Название="Первая"},
            new Группы {ID=2, Название="Вторая"},
            new Группы {ID=3, Название="Третья"},
            new Группы {ID=4, Название="Четвёртая"}
        }.AsQueryable ();

        public IQueryable<Группы> СписокГрупп;

        public  ФиктивныйГруппыRepositorty()
        {
            using (var db = new БазаДанныхEntities())
            {
                try
                {
                    СписокГрупп = db.Кусты;
                }
                catch
                {
                    СписокГрупп = ФиктивныеГруппы;                
                }
                finally { }
                {
                }
            }
        }

        public IQueryable<Группы> _Группы
        {
            get { return СписокГрупп; }
        }
    }
}



В результате выдаёт ошибку:авторНевозможно завершить операцию, поскольку класс DbContext был удален.
Подскажите, что я не понимаю.
Из-за выделенной в коде контроллера конструкции в момент реального запроса к данным "класс DbContext удален".
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414653
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAhVosttпропущено...
вы с МСУ похоже не догоняете о чем говорит Алексей...Объясни своими словами.

представьте себе ситуацию, что никакого LINQ вообще нет. что тогда? вы будете делать нечто подобное, чтобы упростить ситуацию. придумаете свой сервис, чтобы генерить SQL код, чтобы не писать его вручную. объявите стандартный интерфейс типа GetById, GetAll... и т.д. короче сделаете свой репозиторий.

при наличии LINQ и необходимых провайдеров этого делать не нужно. по сути дата контекст -- это и есть репозиторий.

но в таком случае, вы решаете, что он позволяет слишком дофига. как выражается МСУ "крутить базу может кто как хочет". но ведь вам не нужно больше заботиться о том, как данные храняться? вы просто показываете класс и говорите "дай мне коллекцию вот таких объектов".

это и есть репозиторий. IQueryable<T> с этой задачей прекрасно справляется.

а теперь всякие IsDeleted, IsActive и прочая хрень, это уже бизнес-логика. для хранилища (базы данных) удаленный объект, -- это его отсутствие. запись с флагом IsDeleted -- это такая же запись, как и все остальные. хранилищу вообще по барабану на все эти флаги, условия, уровни пользовательского доступа приложения.

так вот это уже бизнес-логика. и никоим образом не имеет отношения к репозиторию. а вы эту логику с умным видом навешиваете на репу. репа это как раз то самое, что надо "крутить как хочешь".

в прикладной уровень выдайте сервис, который уже отдает IEnumerable и IList. а репу не трожьте.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414675
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttskyANAпропущено...
Объясни своими словами.

представьте себе ситуацию, что никакого LINQ вообще нет. что тогда? вы будете делать нечто подобное, чтобы упростить ситуацию. придумаете свой сервис, чтобы генерить SQL код, чтобы не писать его вручную. объявите стандартный интерфейс типа GetById, GetAll... и т.д. короче сделаете свой репозиторий.

при наличии LINQ и необходимых провайдеров этого делать не нужно. по сути дата контекст -- это и есть репозиторий.

но в таком случае, вы решаете, что он позволяет слишком дофига. как выражается МСУ "крутить базу может кто как хочет". но ведь вам не нужно больше заботиться о том, как данные храняться? вы просто показываете класс и говорите "дай мне коллекцию вот таких объектов".

это и есть репозиторий. IQueryable<T> с этой задачей прекрасно справляется.

а теперь всякие IsDeleted, IsActive и прочая хрень, это уже бизнес-логика. для хранилища (базы данных) удаленный объект, -- это его отсутствие. запись с флагом IsDeleted -- это такая же запись, как и все остальные. хранилищу вообще по барабану на все эти флаги, условия, уровни пользовательского доступа приложения.

так вот это уже бизнес-логика. и никоим образом не имеет отношения к репозиторию. а вы эту логику с умным видом навешиваете на репу. репа это как раз то самое, что надо "крутить как хочешь".

в прикладной уровень выдайте сервис, который уже отдает IEnumerable и IList. а репу не трожьте.И тут Остапа понесло. Чтоб тебя завтра на Java заставили писать.

А если серъёзно, то ты глупости сейчас выдумываешь.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414682
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt, были озвучены 3 главные причины, почему IQueryable в репозитории это плохо:
1. Нужно держать живым дата контекст на протяжении более длительного времени. Это плохая практика.
2. "Крутить базу может кто как хочет" (с) Это сеет хаос и демократию прикладного кода, в отличие от строго специфицированных репозиториев.
3. И самая главная причина: зависимость от MSSQL + EF. Изменится источник или хранилище данных - приплыли.

Всё это: жесткие архитектурные ограничения. Нравится прибивать на каждый чих себя гвоздями? Я не против. У меня все репозитории (сервисы данных) возвращают коллекции через IEnumerable<T>. А что там спрятано за методом репозитория - никому знать об этом не нужно.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414691
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУУ меня все репозитории ( сервисы данных ) возвращают коллекции через IEnumerable<T>. А что там спрятано за методом репозитория - никому знать об этом не нужно.

3 главные причины, с которыми я полностью согласен.

только осталось одно но.

уточни пожалуйста, ты говоришь про репозитории или всё таки про сервисы данных ? или это у тебя одно и тоже?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414709
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttуточни пожалуйста, ты говоришь про репозитории или всё таки про сервисы данных ? или это у тебя одно и тоже?
У меня это одно и тоже, я об этом уже писал. Это непринципиально в контексте обсуждаемой темы. Абсолютно.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414713
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAИ тут Остапа понесло. Чтоб тебя завтра на Java заставили писать.

А если серъёзно, то ты глупости сейчас выдумываешь.

нифига. представь себе работу служащего склада. он тебе выдаст что хочешь, и заберет у тебя что хочешь, если площадь позволяет.

однако. просто так он тебе ничего не отдаст. и просто так ничего не примет. только по накладной.

выдача накладных -- задача специального сервиса. работник склада -- репозиторий. напрямую с репозиторием никто не работает, только через сервис.

однако, машина которая приезжает от клиента, может вмещать определенное количетство товаров. и в случае чего приедет еще столько раз сколько нужно. в этом случае она работает со складом, однако опять же, по накладным, считай что с сервисом.

неужели непонятно?

репозиторий -- это абстракция над реальным хранилищем.

к примеру, дата контекст напрямую крутить не имеет смысла, так как -- прямая зависимость от EF / MS SQL. но если дата контекст будет реализовывать внешний интерфейс репозитория, то проблема решена. подсовывай вместо дата контекста что угодно, хоть зампаленные в память коллекции классов. по барабану. лишь бы интерфейс был полностью реализован.

что самое простое в данном случае, это реализовать IQueryable<T>. и парочку Add/Update. управляются транзакции через UnitOfWork, который являясь отдельным интерфейсом, логически существует вообще в стороне.

на счет времени жизни. то здесь уже давно есть решение. управлять жизнью объектов нельзя с помощью примитивного using() -- это детский сад и даже не смешно. создается специальный логический контекст типа LifeScope, которым рулит DI контейнер.

а то высосали проблему из пальца. и теперь решают её дедовскими методами :)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414714
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУhVosttуточни пожалуйста, ты говоришь про репозитории или всё таки про сервисы данных ? или это у тебя одно и тоже?
У меня это одно и тоже, я об этом уже писал. Это непринципиально в контексте обсуждаемой темы. Абсолютно.

это принципиально. читай выше.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414720
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КВ форму редактирования уходит объект, сгенерированный по таблице из базы. Это select * from ?
Почему он должен быть "select * from"? А если там еще 10 блоб полей, а если там еще секурность, а если там еще логика - давать поле или не давать. За это отвечает репозиторий, который умеет работать с ISecurityService (через IoC).Если бы да кабы... я описал конкретную ситуацию, которая у меня часто встречается. Постановка задачи - форме редактирования нужен объект, соответствующий таблице БД. Накой тут DTO?

МСУАлексей Кпропущено...
Тут в двух словах не расскажешь, бери пробуй. Я попробовал - мне понравилось. :-)
Ну давать в трёх словах, мы не торопимся :)Я тороплюсь. :-)

МСУАлексей КАх вот ты о чём. :-)
То есть фильтруем на сервере приложений и фильтруем это же поле и на подписчиках? Изящно :)На каких подписчиках? Речь о логике в сервере приложений. На клиента уходит T[]. Я не сторонник LINQ-over-WCF, если ты об этом.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414723
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
Речь идёт о реализации логики к одной SQL базе. Понятно, что если баз много или они не-SQL, IQueryable тут вряд ли пригодится.Бизнес имеет тенденцию расширяться, если он конечно успешный. Сегодня база одна, а завтра...

Наверняка многие, кто пользуется вашими сервисами, имеют при этом свою локальную SQL базу.При этом надо понимать, что мы жертвуем производительностью.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414732
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КЯ о том, что такой подход приведёт к необходимости множества методов типа GetMyEntityByID(int id) , что в свою очередь приведёт к N+1. IQueryable избавляет от этой напасти.
Так отдавай сразу весь дата контекст, он тебе и так прокидывает все таблицы и вьюхи как IQueryable.В IQueryable может быть завёрнута прикладная логика.

МСУВ GetMyEntityByID есть один большой плюс, кода больше, но весь код структирован и как на ладони. Легкость в сопровождении такого кода, простота и очевидность в рефакторинге, внятное документирование.Это да. Вдобавок - не каждую логику можно завернуть в IQueryable/Expression. GetByID в определённых случаях единственный выход. Всему своё место.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414744
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttМСУпропущено...

У меня это одно и тоже, я об этом уже писал. Это непринципиально в контексте обсуждаемой темы. Абсолютно.

это принципиально. читай выше.

Это не принципиально. Если тебе нечего сказать по теме и ты хочешь побеседовать на другие темы, то мне просто лень тебе объяснять очевидные вещи. Извини.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414746
Just User
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA,
А как правильно?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414762
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttskyANAИ тут Остапа понесло. Чтоб тебя завтра на Java заставили писать.

А если серъёзно, то ты глупости сейчас выдумываешь.

нифига. представь себе работу служащего склада. он тебе выдаст что хочешь, и заберет у тебя что хочешь, если площадь позволяет.

однако. просто так он тебе ничего не отдаст. и просто так ничего не примет. только по накладной.

выдача накладных -- задача специального сервиса. работник склада -- репозиторий. напрямую с репозиторием никто не работает, только через сервис.

однако, машина которая приезжает от клиента, может вмещать определенное количетство товаров. и в случае чего приедет еще столько раз сколько нужно. в этом случае она работает со складом, однако опять же, по накладным, считай что с сервисом.

неужели непонятно?

репозиторий -- это абстракция над реальным хранилищем.

к примеру, дата контекст напрямую крутить не имеет смысла, так как -- прямая зависимость от EF / MS SQL. но если дата контекст будет реализовывать внешний интерфейс репозитория, то проблема решена. подсовывай вместо дата контекста что угодно, хоть зампаленные в память коллекции классов. по барабану. лишь бы интерфейс был полностью реализован.

что самое простое в данном случае, это реализовать IQueryable<T>. и парочку Add/Update. управляются транзакции через UnitOfWork, который являясь отдельным интерфейсом, логически существует вообще в стороне.

на счет времени жизни. то здесь уже давно есть решение. управлять жизнью объектов нельзя с помощью примитивного using() -- это детский сад и даже не смешно. создается специальный логический контекст типа LifeScope, которым рулит DI контейнер.

а то высосали проблему из пальца. и теперь решают её дедовскими методами :)Ну и какую умную мысль ты этим хочешь донести?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414768
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Just UserskyANA,
А как правильно?Я не использую IQueryable вне репозитория и не использую EF. Это камрада hVostt лучше спросить

Но. Варианта два:
1. Поднимать DbContext в начале запроса, убивать в конце;
2. Поднимать контекст на время работы конкртеного метода репозитория:Just Userхотя если в репозитарии пишу что-нибудь так
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
using (var db = new БазаДанныхEntities ())
{
    try
    {
        СписокГрупп= from o in db.Группы select o;
    }
    catch
    {
        СписокГрупп = ФиктивныеГруппы;                
    }
    finally { }
}
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414769
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
Если мы готовы к "N+1", можно и скрыть. Всё зависит от задачи.Вы определение репозитория забыли, или Вы с ним не согласны?Тут с этими определениями кто во что горазд.

repository == data access layer

Если доступ к данным будет содержать методы вроде GetXXXByID, при реализации слоя логики N+1 неизбежен.
...
Рейтинг: 0 / 0
25 сообщений из 238, страница 4 из 10
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / IRepository как пользоваться
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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