проверка взаимодействия с базой данных mvc asp.net - PullRequest
7 голосов
/ 17 мая 2009

Есть ли у кого-нибудь ссылки или советы о том, как подключить проверку, которая требует взаимодействия с базой данных перед обновлением или добавлением в базу данных? Каждый пример, который я вижу, показывает, как проверить свойства, например. «Требуется», «Является ли электронная почта», «Числовой» и т. Д., Но как подключить проверку к «Не удается оформить заказ»? Это сообщение в блоге xVal затрагивает его, но не дает пример.

Я следовал учебному пособию по NerdDinner, в котором используется репозиторий, но это то, чего я не совсем понимаю ... Скажем, у нас был OrderController с методом Create, и перед созданием ордера нам пришлось сначала проверить что товар есть в наличии. В стиле NerdDinner контроллер использует Репозиторий для связи с базой данных, так как наш объект Order (Модель) сможет обеспечить выполнение этой проверки наряду с проверкой свойства, поскольку он не может общаться с базы данных?

Спасибо за любую помощь

Ответы [ 3 ]

3 голосов
/ 17 мая 2009

В учебном пособии NerdDinner вы можете проверить IsVaild, а затем методы GetRuleViolation. Исходя из правил вашей компании и базы данных, вы можете использовать их для проверки имеющихся у вас данных, прежде чем вставить их. Вы можете даже создать метод IsValidForInsert, чтобы проверить любые правила вставки, которые вам нужно применять.

В NerdDinner, GetRuleViolation позволяет вам извлекать нарушенные правила и передавать их в интерфейс по вашему выбору.

    public bool IsValid
    {
        get { return (GetRuleViolations().Count() == 0); }
    }

    public IEnumerable<RuleViolation> GetRuleViolations()
    {


        if (CheckDbForViolation)
            yield return new RuleViolation("Database Violation", "SomeField");

        if (String.IsNullOrEmpty(Title))
            yield return new RuleViolation("Title is required", "Title");

        if (String.IsNullOrEmpty(Description))
            yield return new RuleViolation("Description is required", "Description");

        if (String.IsNullOrEmpty(HostedBy))
            yield return new RuleViolation("HostedBy is required", "HostedBy");

 ... etc ...


        yield break;
    }

    public bool CheckDbForViolation()

    {

    /// Do your database work here...

    }

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

1 голос
/ 17 мая 2009

Вам не нужны какие-либо указания из примеров того, как это сделать. В конечном итоге вам придется создавать такие приложения самостоятельно, что означает творческий подход.

Я с самого начала решил не использовать ни встроенную проверку, ни API членства, чтобы не столкнуться с его ограничениями в какой-то момент времени.

Для вашей ситуации: это в значительной степени стандартно.

Представьте себе поток выполнения следующим образом:

  1. Почтовая форма
  2. Проверка формата входных данных без обращения к базе данных
  3. Если (2) задано, вы проверяете ввод с точки зрения бизнес-правил / целостности данных. Здесь вы говорите с базой данных
  4. Если (3) пройдено, то выполнить свою операцию, какой бы она ни была. Если это каким-то образом дает сбой (возможно, правила целостности данных в базе данных запрещают операцию, например, вы удалили связанный объект из другого окна браузера), отмените его и уведомите пользователя об ошибке операции.

Старайтесь, чтобы методы контроллера были как можно более пустыми. Логика проверки и работы должна находиться в ваших моделях и бизнес-логике. Контроллер должен в основном пытаться выполнить одну предполагаемую операцию и в зависимости от возвращенного состояния просто возвращать одно представление или другое. Может быть, еще несколько вариантов, но не весь набор проверок ролей пользователей, прав доступа, вызовов некоторых веб-служб и т. Д. Упростите процесс.

P.S. У меня иногда складывается впечатление, что встроенные функции, предназначенные для упрощения простых вещей для большинства разработчиков, имеют тенденцию создавать новые барьеры над удаленными.

0 голосов
/ 17 мая 2009

Я бы создал OrderService с методом PlaceOrder (Order order). OrderService использует репозиторий для выполнения операций CRUD и для обеспечения соблюдения бизнес-правил (проверка запасов) и, в конечном итоге, выдает исключение при нарушении правил, которое вы можете перехватить и сообщить пользователю.

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