Хорошие вопросы. Я тоже думал о них несколько дней назад.
На самом деле, попробуйте NHibernate 3.0 alpha (или текущий транк), его новый поставщик LINQ намного превосходит предыдущие. (До сих пор я нашел только один метод, который не работает, но можно подключить свой собственный механизм, если вы столкнетесь с чем-то, что он не поддерживает по умолчанию.)
У меня не было проблем (пока?) С использованием текущего транка. На сайте http://www.hornget.net/packages/ можно найти "ночные" сборки, а также сборку FluentNHibernate. Свободное владение действительно увеличивает вашу производительность, если вы знаете, как его использовать. Сообщество SO действительно помогло мне с этим .
Если вы согласны с тем, что ваш бизнес-уровень имеет прямую зависимость от NHibernate, или вы пишете приложение меньшего размера, которое остается обслуживаемым без такой абстракции, вы можете обойтись без шаблона хранилища. Однако, если вы все сделаете правильно, это избавит вас от лишнего кодирования.
Причина абстрагирования этого не только полезна, потому что тогда вы можете заменить NHibernate позже другим ORM, но это хорошая практика из-за концепции, называемой Разделение проблем . Ваш уровень бизнес-логики не должен заботиться или знать что-либо о том, как получить доступ к данным, с которыми он работает. Это облегчает обслуживание приложения или его различных уровней, что также облегчает командную работу: если X создает слой доступа к данным, а Y пишет бизнес-логику, им не нужно подробно знать работу друг друга.
Представление IQueryable<T>
- очень хорошая идея, и это именно то, что многие реализации репозитория делают прямо сейчас. (И я тоже, хотя я предпочел написать это в статическом классе.)
И, конечно, вам нужно будет предоставить некоторые методы для вставки или обновления сущности или методы для начала и совершения транзакций, если вы хотите. (BeginTransaction должна просто вернуть IDisposable
, чтобы избежать утечки интерфейса NHibernate, и это будет хорошо.)
Я могу дать вам несколько указаний: проверить реализации SharpArchitecture или FubuMVC Contrib, чтобы получить некоторые идеи о том, как сделать это правильно, и это , как я решил это .