Дизайн приложения и требуемые соглашения о хранимых процедурах - PullRequest
2 голосов
/ 30 января 2012

Первый фон,

В настоящее время я работаю над сравнительно большим приложением Asp.Net MVC, которое я старался, насколько это возможно, разрабатывать на основе доменной модели, используя хорошие принципы проектирования. Мы обязаны делать все доступ к базе данных через хранимые процедуры (Oracle). В этом приложении у меня есть множество контроллеров, которые используют служебные объекты для выполнения бизнес-логики и, в свою очередь, обращаются к объектам репозитория для обеспечения доступа.

Мне только что сообщили, что dba требует передачи нескольких общих параметров в каждую хранимую процедуру в дополнение к параметрам, необходимым для извлечения / обновления / вставки данных. Эти параметры включают в себя имя пользователя, IP-адрес и домен пользователя, отправляющего исходный веб-запрос. Эти данные затем используются каждой хранимой процедурой для вызова функций, которые регистрируют доступ и проверяют, есть ли у пользователя разрешения на выполнение этой конкретной хранимой процедуры.

Я попытался мягко объяснить, что я чувствую, что это плохой дизайн и что приложение .Net может просто вызывать хранимые процедуры, предназначенные для регистрации и проверки разрешений, когда это необходимо. К сожалению, эта методология хорошо зарекомендовала себя в среде, и dba не желает ее менять.

Итак, теперь на мой вопрос,

Есть ли у кого-нибудь хорошие идеи о том, как я могу получить эти дополнительные параметры и доставить их объектам репозитория, не создавая большого беспорядка? Из того, что я могу сказать, эти данные доступны только из веб-контекста, когда на уровне контроллера. Это означает передачу дополнительных данных классу на уровне сервиса и затем каждому классу репозитория. Я бы хотел максимально уменьшить боль здесь.

Ответы [ 2 ]

3 голосов
/ 30 января 2012

Если вы используете внедрение зависимостей (это не вы - это большой проект) Вы можете просто добавить сервис в контроллер. Затем хранилище вводится в службу. Конструкция репозитория будет принимать IUserSettings (или как там его называют), который является конкретной реализацией требуемых вами деталей. Затем он доступен для каждого хранилища.

public YourRepositoryClass(IUserSettings userSettings)
{
 _userSettings = userSettings;
}

и вуаля - это доступно.

1 голос
/ 31 января 2012

Вы просили администратора БД рассмотреть вопрос об использовании DBMS_APPLICATION_INFO?Затем вы можете установить его всякий раз, когда выделяете соединение для пользовательского запроса, а затем процедура ведения журнала администратора базы данных может прочитать его.

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