Шаблон репозитория - POCO или IQueryable? - PullRequest
12 голосов
/ 12 апреля 2009

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

Одним из них является то, что IRepository должен вернуть.

Я бы хотел иметь дело ТОЛЬКО с Pocos, чтобы у меня была реализация IRepository для каждого агрегатного корня, например:

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

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

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

OrangeRepositoryOracle, OrangeRepositorySQL, OrangeRepositoryMock и т. Д.

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

Я на правильных линиях?

Спасибо

РЕДАКТИРОВАТЬ: Спасибо за отзыв, у меня больше никого нет, чтобы отразить эти идеи в данный момент, поэтому это ценится!

Ответы [ 2 ]

9 голосов
/ 12 апреля 2009

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

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

5 голосов
/ 12 апреля 2009

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

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

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

Тогда вы получите

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