powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / IRepository как пользоваться
25 сообщений из 238, страница 1 из 10
IRepository как пользоваться
    #38414160
Just User
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу помощи.
Начал разбираться с репозитариями... На сайте вроде всё красиво описывают, но в реале у меня не работает.
Подскажите ,что делаю не так.
Имеется база данных на SQLExpress.
1. В проект добавил edmx сформировав его на основе базы данных.
2. Описал абстрактный интерфейс
Код: c#
1.
2.
3.
4.
5.
6.
7.
namespace Model.Abstract
    {
    public interface IГруппыRepository
        {
        IQueryable<Группы> _Группы { get; }
        }
    }


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.
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 СписокГрупп; }
            }
    }
}


в коде контроллера
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 public class HomeController : Controller
        {
        private IГруппыRepository РепозитарийГрупп;


        public HomeController ( )
            {
            РепозитарийГрупп = new ФиктивныйГруппыRepositorty();
            }
       
        public ActionResult Index ( )
            {
           
            
            return View (РепозитарийГрупп._Кусты.ToList());
            }


В результате выдаёт ошибку:
авторНевозможно завершить операцию, поскольку класс DbContext был удален.
хотя если в репозитарии пишу что-нибудь так
Код: 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 как пользоваться
    #38414166
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Не надо возвращать IQueryable<T> в репозиториях, только IEnumerable<T> или IList<T>.
2. Если нужны динамические фильтры, их смело можно описать через Func<> параметр. Параметр перед вызовом честно инициализируется через анонимный делегат.
3. Читай твой "полурусский" код просто невозможно. Пиши нормально и люди тебя начнут понимать.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414177
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ1. Не надо возвращать IQueryable<T> в репозиториях, только IEnumerable<T> или IList<T>.
2. Если нужны динамические фильтры, их смело можно описать через Func<> параметр. Параметр перед вызовом честно инициализируется через анонимный делегат.
3. Читай твой "полурусский" код просто невозможно. Пиши нормально и люди тебя начнут понимать.

слушай, существует мнение, что IQueryable<T> -- уже готовый интерфейс репы, т.е. его можно невозбранно возвращать. да и как быть с тем же OData? есть весовые причины готовить только IEnumerable/IList?

ну кроме той, чтобы оставить возможность подсовывать в качестве источника данных, провайдер которого даже не собирается поддерживать LINQ?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414217
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414222
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttслушай, существует мнение, что IQueryable<T> -- уже готовый интерфейс репы, т.е. его можно невозбранно возвращать. да и как быть с тем же OData?
OData - это другая специфика и принцип работы. Не нужно мешать OData с классическим репозиторием.

hVosttесть весовые причины готовить только IEnumerable/IList
Скиана опередил. У меня тоже этот рецептик пылится. Учи, вникай.
http://codearticles.ru/articles/2357
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414234
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAhVostt, смотри тут: Проблемы при использовании шаблона Repository .

Эту статью уже как-то рассматривали. Проблем в передаче из репозитория IQueryable<T> не увидел. Спецификации по-любому нужны. Технические поля сущностей ORM скрываются моделью DTO (можно вообще работать с интерфейсами, если уж ORM на столько уродский). UnitOfWork вообще отдельная песня, какого ляда он делает в объекте репозитория? Нафиг его оттуда и проблема решена.

В общем проблем не вижу. Пока что. Или я что-то проглядел? Что может пойти не так при использовании IQueryable<T>? Чистый интерфейс без возможности как-то модифицировать репу.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414252
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

пока что в рецептике усмотрел единственную проблему: Ссылка на Repository из доменного объекта

но отказываться от лейзи пропертей в пользу рисования отдельного DTO над DTO я бы не стал, это не решение проблемы, это геморрой на задницу. спецификации никто не отменял, Include никто не отменял, все это прекрасно ложиться на паттер "Корень агрегации".
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414256
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУOData - это другая специфика и принцип работы. Не нужно мешать OData с классическим репозиторием.

как это? у проекта уже есть слой доступа к данным, бизнес-логика. предлагаешь для OData отдельно прокинуть какой-то другой механизм? и в чём профит?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414302
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttskyANAhVostt, смотри тут: Проблемы при использовании шаблона Repository .
Эту статью уже как-то рассматривали. Проблем в передаче из репозитория IQueryable<T> не увидел.
Если не увидел - это твои и только твои проблемы. Пиши код хоть раком, нам-то что с того. Ты попросил озвучить причины, тебе озвучили.

hVosttМСУ, пока что в рецептике усмотрел единственную проблему: Ссылка на Repository из доменного объекта
Речь о IQueryable, сосредоточься. В DTO не нужны никакие ленивые свойства, DTO это объект для трансфера и только.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414309
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttМСУOData - это другая специфика и принцип работы. Не нужно мешать OData с классическим репозиторием.

как это? у проекта уже есть слой доступа к данным, бизнес-логика. предлагаешь для OData отдельно прокинуть какой-то другой механизм? и в чём профит?
В OData IQueryable оперирует контроллер и только он. Контроллер - это не репозиторий. У тебя как всегда смешалось в кучу всё, кони, люди, сено. Еще раз, речь не о OData, в котором есть своя специфика - работа с IQueryable.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414348
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУDTO это объект для трансфера и только.DTO - это часто архитектурный костыль, возникающий из-за смешивания логики и данных в одном классе!
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414356
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttskyANAhVostt, смотри тут: Проблемы при использовании шаблона Repository .

Эту статью уже как-то рассматривали. Проблем в передаче из репозитория IQueryable<T> не увидел.Как поарботаешь в команде из 10+ человек, так поймёшь.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414361
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУНе надо возвращать IQueryable<T> в репозиториях, только IEnumerable<T> или IList<T>.Отказ от IQueryable может привести к необходимости реализации через "N+1 запрос", там где этого можно избежать.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414362
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМСУDTO это объект для трансфера и только.DTO - это часто архитектурный костыль, возникающий из-за смешивания логики и данных в одном классе!
Не понял, а логика тут каким боком? )
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414367
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМСУНе надо возвращать IQueryable<T> в репозиториях, только IEnumerable<T> или IList<T>.Отказ от IQueryable может привести к необходимости реализации через "N+1 запрос", там где этого можно избежать.
Шаблон Specification, изучаем. Скиана ссылку дал.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414378
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей Кпропущено...
DTO - это часто архитектурный костыль, возникающий из-за смешивания логики и данных в одном классе!
Не понял, а логика тут каким боком? )
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class C
{
    public int A1 { get; set; }

    public int A2 { get; set; }

    // С сериализацией такого свойства могут возникнуть проблемы.
    // Если логику оставить как есть, вероятно, придётся писать DTO.
    public int A3 { get { return A1 + A2; } }
}

Если работать с WCF, в этом примере тут проблемы точно будут.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414380
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМСУпропущено...

Не понял, а логика тут каким боком? )
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class C
{
    public int A1 { get; set; }

    public int A2 { get; set; }

    // С сериализацией такого свойства могут возникнуть проблемы.
    // Если логику оставить как есть, вероятно, придётся писать DTO.
    public int A3 { get { return A1 + A2; } }
}

Если работать с WCF, в этом примере тут проблемы точно будут.

Это не DTO.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414384
Just User
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кто нибудь может пояснить в моём коде, что не так и как это можно исправить.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414388
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей Кпропущено...
Отказ от IQueryable может привести к необходимости реализации через "N+1 запрос", там где этого можно избежать.
Шаблон Specification, изучаем. Скиана ссылку дал.Его возможности ограничены. Есть способы лучше. Правда EF "из коробки" такого не умеет, но оно реализуется сравнительно не сложно.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
static readonly Expression<Func<C, int>> AddExpr => c => c.A1 + c.A2;

....


var r = 
    from c in db.C
    select new
    {
        c.A1,
        c.A2,
        A3 = AddExpr.Invoke(c.A1, c.A2)
    }
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414392
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей Кпропущено...

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class C
{
    public int A1 { get; set; }

    public int A2 { get; set; }

    // С сериализацией такого свойства могут возникнуть проблемы.
    // Если логику оставить как есть, вероятно, придётся писать DTO.
    public int A3 { get { return A1 + A2; } }
}

Если работать с WCF, в этом примере тут проблемы точно будут.

Это не DTO.Да. Это повод создать DTO на пустом месте, о чём я и хотел сказать. :-)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414398
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КЕго возможности ограничены.
Чем?

Алексей КЕсть способы лучше. Правда EF "из коробки" такого не умеет, но оно реализуется сравнительно не сложно.
Речь не о поддержке трансляции выражения, а о типе возвращаемом значении, в данном случае IQueryable.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414400
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КЭто повод создать DTO на пустом месте, о чём я и хотел сказать. :-)
Нет никакого пустого места :) DTO нужен только для трансфера. Нужен трансфер (SOA, голуби, РЖД России, etc) - берем DTO, намапливаемся, передаем. Не понимаю проблемы... Причем тут логика-то?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414403
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КЕго возможности ограничены.
Чем?Функционалом. :-)

МСУАлексей КЕсть способы лучше. Правда EF "из коробки" такого не умеет, но оно реализуется сравнительно не сложно.
Речь не о поддержке трансляции выражения, а о типе возвращаемом значении, в данном случае IQueryable.IQueryable + подставляемые выражения (назовём это так) позволяют творить чудеса. Зачем же себя ограничивать?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414406
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КЭто повод создать DTO на пустом месте, о чём я и хотел сказать. :-)
Нет никакого пустого места :) DTO нужен только для трансфера. Нужен трансфер (SOA, голуби, РЖД России, etc) - берем DTO, намапливаемся, передаем. Не понимаю проблемы... Причем тут логика-то?Проблема в самой необходимости слоя DTO, когда без него можно обойтись.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414407
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КФункционалом. :-)
Каким?
Так... Попахивает топиком ненависти к ASP.NET MVC

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


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