В мире архитектуры программного обеспечения существует множество противоречивых мнений, и многие из них очень обоснованы.
1) Да, определение хранилища для каждого совокупного корня может быть излишним, но вы можете обнаружить, чтоспособ извлечения данных для этого корня может быть специфичным для него, и вы хотите иметь возможность управлять им в настраиваемом хранилище.Статья Айенде очень красноречива и тесно связана с желанием типичного разработчика «перегружать архитектуру» решениями - часто в ущерб функциональности.
2) Использование LINQ с NHibernate - вариант, но я хотел бы подчеркнуть, что вы должныдайте себе возможность использовать критерии запросов или HQL, если вы сделаете это.На этом этапе вы можете столкнуться с множеством исключений, и вам будет интересно, какова была начальная точка абстракции.
3) QueryOver
- это типобезопасная оболочка для запросов критериев, и только она делает ихгораздо привлекательнее для меня.Я так часто сталкиваюсь с критериями абсолютного контроля, которые они предлагают - часто случается, что мне приходится использовать «магические струны».По сути, это сделает NHibernate вашей абстракцией доступа к данным.На самом деле, это была бы лучшая абстракция, чем большинство «репозиториев», потому что большинство из них просто предоставляют методы CRUD ... репозиторий должен иметь возможность обрабатывать спецификации запросов (именно так работает QueryOver
).
Какнасколько транзакции идут - это зависит от вашей структуры.На самом деле я не думаю, что это реалистично или выгодно использовать шаблон единицы работы в приложении и скрывать реализацию от него (вы можете абстрагировать его - но какой в этом смысл? - вы действительно собираетесь изменить свой ORM?)
Если вы используете ASP.NET, просто (как минимум) запустите транзакцию в начале запроса, выполните откат исключений и подтвердите в конце.
Если вы используете WinFormsтогда вам, возможно, придется считать срок службы каждой задачи пользовательского интерфейса своей единицей работы.