2009-04-12 1 views
12

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

Одним из них является возвращение IRepository.

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

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

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

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

OrangeRepositoryOracle, OrangeRepositorySQL, OrangeRepositoryMock и т.д.

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

Есть ли я на правильных линиях?

Благодаря

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

ответ

9

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

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

5

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

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^