Есть ли у репозиториев скрытая зависимость от базы данных? - PullRequest
1 голос
/ 12 августа 2010

Например, у вас есть интерфейс IRepository.У вас также есть класс SqlRepository, который реализует интерфейс, поддерживаемый базой данных SQL.Допустим, конструктор для этого класса принимает строку подключения.Если ваш репозиторий выполняет вызовы хранимых процедур и эти вызовы являются внутренними по отношению к репозиторию, не является ли это скрытой зависимостью?Ваш репозиторий зависит не только от соединения с базой данных, указанного в строке соединения, но и от базы данных, в которой установлены надлежащие хранимые процедуры.Если в вашей резервной базе данных нет хранимых процедур, ваша программа завершится сбоем.Как вы узнаете, какие хранимые процедуры должны быть установлены для запуска вашей программы, если у вас нет доступа к коду SqlRepository?Это тот тип скрытой зависимости, который заставляет сторонников DI съеживаться?

Ответы [ 2 ]

1 голос
/ 13 августа 2010

Да. Проблема заключается в том, что невозможно навязать контракты для баз данных SQL (контракты в объектно-ориентированном смысле).

То есть мы не можем сказать, что база данных соответствует интерфейсу IPersonRepository, поэтому мы не можем быть уверены, что она реализует процедуру "dbo.GetPerson", которая возвращает два набора результатов со столбцами a , б, в и д. (Или что у нас есть разрешение на выполнение этой процедуры.) Поэтому мы не можем требовать IPersonRepository в нашей строке подключения.

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

Это еще один аспект несоответствия объектно-реляционного импеданса , хотя о нем я ничего не писал.

1 голос
/ 12 августа 2010

Хм ... ваш репозиторий также зависит от вашей базы данных, имеющей определенные таблицы, и от тех таблиц, которые имеют определенные столбцы. Это все зависимости, но они не особенно скрыты.

На самом деле это даже большие зависимости, чем хранимая процедура. Хранилище может быть переписано, чтобы не нуждаться в них, но данные действительно должны быть там ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...