LINQ к SQL и шаблону репозитория

Используйте PDO и подготовленные запросы.

($conn - объект PDO)

$stmt = $conn->prepare("INSERT INTO tbl VALUES(:id, :name)");
$stmt->bindValue(':id', $id);
$stmt->bindValue(':name', $name);
$stmt->execute();
44
задан Peter Mortensen 12 August 2011 в 14:55
поделиться

3 ответа

Вещь - это, LINQ к SQL не является истинным Объектный Картопостроитель Отношения (ORM), это - генератор уровня доступа к данным. Можно заставить его быть ORM путем движения глубоко рукой, редактируя XML-файлы и играя с SqlMetal и этажерка, но где это сияет, как DAL.

идея позади ORM - это. У Вас есть своя база данных SQL и свои объекты области. Для разработки базы данных правильно Вы собираетесь сделать вещи (как нормализация), которые логически не переводят в правильно разработанную объектную модель, и наоборот. Это называют "Несоответствием Импеданса", роль ORM должна иметь дело с тем несоответствием чистым, эффективным, и эффективным способом. Менее болезненное взаимодействие базы данных является почти вторичной вещью.

идея позади репозитория состоит в том, что он инкапсулирует всю логику персистентности и зависимости от инфраструктуры от остальной части Вашего приложения. Когда для Вашего приложения нужен Потребительский объект, ему не придется знать, прибывает ли оно из SQL Server, MySQL, XML-файла или Членства ASP.NET. Как только у Вас есть то разъединение, любые изменения, которые Вы вносите в свою историю персистентности, не имеют никакого эффекта на остальную часть Вашего приложения.

, Имея это в виду, это разбирается больше, почему он сделал то, что он сделал. LINQ к SQL используется для генерации DAL, но единственной вещью, которая должна быть известна о DAL, является репозиторий, таким образом, перевод сделан к его объектам области. Тем путем он может осуществить рефакторинг свою модель предметной области, не волнуясь о его истории персистентности, и он может осуществить рефакторинг свою базу данных, не волнуясь о слегка колеблющихся эффектах через его приложение. Он мог также начать кодировать на бизнес-логике перед выбором вопросов как то, какой ORM использовать, или даже там, где хранить его данные.

, Если он должен был использовать реальный ORM (как NHibernate), тот код отображения обрабатывается в другом месте (или в XML или в загружающихся классах). Я думаю LINQ к SQL (и Грабит DAL с открытым исходным кодом, SubSonic) замечательные проекты, но более разработанный для меньших, двухуровневых приложений, где что-то как шаблон репозитория - излишество. Витрина является также хорошей иллюстрацией того, почему дополнительная сложность NHibernate может быть важной. Он, возможно, сохранил себя много кода путем попытки с чем-то созданным обрабатывать такой сценарий, вместо того, чтобы делать все это вручную.

48
ответ дан Peter Mortensen 26 November 2019 в 22:14
поделиться

Это зависит от того, где DTOs определяется и как Вы хотите протестировать его. Если Вы используете DBML, то LINQ к SQL хочет генерировать объекты данных в слое данных. В то время как LINQ к поддержкам SQL незнание постоянства, это не старается изо всех сил облегчать. Платформа Объекта не поддерживает его вообще.

Это означает, что в стандартной модели, Ваш слой данных определяет все доменные объекты, который хитер, если Вы хотите протестировать пользовательский интерфейс / бизнес-слои в истинной изоляции от слоя данных.

А прагматический подход мог бы быть должен использовать определения объекта данных от слоя данных в модульных тестах, но не контекст данных (т.е. скрыть контекст данных позади интерфейса репозитория, но представить типы объекта) - но это пачкает воды немного и означает Ваш UI, и т.д. должен сильно сослаться на слой данных. Но если Вы думаете об этом как о "слое модели предметной области, который, оказывается, также содержит реализацию репозитория, что мы можем или не можем использовать", Вы могли бы выровнять по ширине его.

Остающиеся абсолютно отдельные доменные объекты делают поблочное тестирование и инверсия управления (МОК) более "чистый", но увеличивают объем кода, который Вы имеете (таким образом обоюдоострый).

13
ответ дан Peter Mortensen 26 November 2019 в 22:14
поделиться

Действительно ли сгенерированные объекты являются сериализуемыми? У меня было впечатление, которым они не были. Это - просто случай изоляции, как Marc Gravel сказал выше.

, Что, если Вы переключаете репозиторий и имеете MySQL, Oracle, XML-файлы, веб-сервис, или безотносительно поставщика данных (Репозиторий)? Вы были бы связаны с LINQ к блоку SQL для ссылки на объекты, правильно? Который, конечно, Вы не хотели бы.

2
ответ дан Peter Mortensen 26 November 2019 в 22:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: