Шаблон хранилища - 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: Спасибо за отзывы, у меня нет никого, кто мог бы отбросить эти идеи на данный момент, так что это оценено!
Ответы
Ответ 1
Да, ваша версия является самой безопасной/самой совместимой. Вы все равно можете использовать его с любыми ресурсами, а не только с доступом к данным, но с веб-службами, файлами и т.д.
Обратите внимание, что с версией IQueryable вы все равно работаете на основе своих классов POCOs, но вы привязаны к IQueryable. Также подумайте, что у вас может быть код, который использует IQueryable, а затем, оказывается, вы попадаете в случай, когда один из ORM репозитория не справляется с этим хорошо.
Ответ 2
Я использую тот же шаблон, что и вы. Мне это очень нравится. Вы можете получать свои данные из любых ресурсов.
Но преимущество использования IQuerable заключается в том, что вам не нужно кодировать свой собственный API критериев, как OrangeCriteria.
Когда NHibernate получает полную поддержку Linq, я могу переключиться на IQueryable.
Затем вы получаете
public class OrangeRepository: IOrangeRepository {
public IQueryable<Orange> GetOranges();
}