Подтвердить что ты не робот

Шаблон хранилища - POCOs или IQueryable?

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

Один из них - это возврат IRepository.

Я хотел бы иметь дело с ONLY Pocos, поэтому у меня была бы реализация IRepository для каждого совокупного корня, например:

public class OrangeRepository: IOrangeRepository
{
  public Orange GetOrange(IOrangeCriteria criteria);
}

где IOrangeCriteria принимает ряд аргументов, характерных для поиска Orange.

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

OrangeRepositoryOracle, OrangeRepositorySQL, OrangeRepositoryMock и т.д.

Я хотел бы оставить его открытым, чтобы я мог использовать EF или NHibernate - опять же, если мой IOrangeRepository имеет дело с POCOs, тогда я бы инкапсулировал его в сам репозиторий, реализовав OrangeRepositoryNHibernate и т.д.

Я на правильных строках?

Спасибо

EDIT: Спасибо за отзывы, у меня нет никого, кто мог бы отбросить эти идеи на данный момент, так что это оценено!

4b9b3361

Ответ 1

Да, ваша версия является самой безопасной/самой совместимой. Вы все равно можете использовать его с любыми ресурсами, а не только с доступом к данным, но с веб-службами, файлами и т.д.

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

Ответ 2

Я использую тот же шаблон, что и вы. Мне это очень нравится. Вы можете получать свои данные из любых ресурсов.

Но преимущество использования IQuerable заключается в том, что вам не нужно кодировать свой собственный API критериев, как OrangeCriteria.

Когда NHibernate получает полную поддержку Linq, я могу переключиться на IQueryable.

Затем вы получаете

public class OrangeRepository: IOrangeRepository {  
    public IQueryable<Orange> GetOranges();
}