2010-03-26 11 views
1

В архитектуре n-уровня лучше всего разместить объектно-реляционное сопоставление (OR/M) на уровне доступа к данным. Например, запросы и обновления базы данных можно делегировать на такой инструмент, как NHibernate.Создание OR/M слабо связан и абстрагировано от других слоев

Тем не менее, я хотел бы сохранить все ссылки на NHibernate в пределах уровня доступа к данным и абстрактных зависимостей от слоев ниже или выше. Таким образом, я могу поменять или подключить другое средство OR/M (например, Entity Framework) или какой-либо подход (например, простые вызовы хранимой процедуры ванили, макетные объекты), не вызывая ошибок во время компиляции или капитального ремонта всего приложения. Возможность тестирования - дополнительный бонус.

Может ли кто-нибудь предложить оболочку (т. Е. Интерфейс или базовый класс) или подход, который сохранит OR/M слабо связанными и содержащимися в 1 слое? Или указать мне на ресурсы, которые помогут?

Спасибо.

ответ

2

Похоже, вы ищете модель repository. Если вам нужно больше развязки, вы можете ввести зависимости данных с помощью контейнера Inversion of Control.

+0

Мне также нужны карты данных или DAOS, так как репозитории будут находиться между моделью домена и уровнем доступа к данным. Подробнее см. Здесь: http://martinfowler.com/eaaCatalog/repository.html Модель домена будет содержать репозитории, но не может содержать ссылку на уровень доступа к данным. Поэтому DAO необходимо будет ввести в репозитории. Моя основная цель - создать базовый класс DAO для каждой технологии доступа к данным (например, NHibernate, Entity Framework, хранилище XML, ...) наследует общий интерфейс. Таким образом, я могу поменять или смешать их по своему усмотрению без перекомпиляции или серьезной переделки. – Genuine

+0

Похоже, вы на правильном пути. –

0

Service Facade Pattern - одно имя. Простые контракты между бизнес-логикой и уровнем данных.

Сервисные классы или бобы (назовите это так, как вы хотите) определяют и реализуют контракт, а также организуют более низкий уровень данных, часто обрабатывая транзакционную логику между объектами данных.

Весной вы определяете интерфейс, а затем реализуете его. Одной из реализаций может быть OR/M, другой может быть сырой JDBC или ADO.NET. В некоторых рамках Аспектно-ориентированное программирование позволяет вводить декларативную транзакционную логику без написания кода. Это избавляет от головной боли.

Одно предостережение: при работе с некоторыми OR/Ms, такими как Hibernate, существует использование классов прокси. Это загрязняет вещи, потому что есть несколько случаев, когда классы-прокси вызывают проблемы. На мой взгляд, это подробная информация, которая не должна выходить из уровня обслуживания. Но с Hibernate это так. Не уверен в реализации .NET.

+0

Я думаю, что сервисный шаблон фасада поможет. Я просто пытаюсь определить, как должен выглядеть контракт или интерфейс. Я предполагаю, что он будет иметь стандартные методы CRUD, а также некоторые для управления сеансом и транзакциями. Лучшие инструменты .NET OR/M и ADO.NET, за исключением Entity Framework, похоже, упрощают создание такого контракта. Тем не менее, я боюсь, что мой проект может пойти на него, несмотря на его основные недостатки. Я хотел бы нажать на NHibernate, но не оставляйте себя на всякий случай, если выбрана Entity Framework. Спасибо за отзыв о декларативной логике транзакций. – Genuine