Дозвуковой - Где я могу включить свою бизнес-логику или пользовательскую проверку

Я использую дозвуковой 2.2

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

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

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

Любая информация очень ценится.


person Dan    schedule 06.10.2010    source источник


Ответы (3)


Сначала вы должны создать частичный класс для вашего объекта DAL, который вы хотите использовать. В моем проекте есть папка Generated, в которой живут сгенерированные классы, и еще одна папка Extended.

Допустим, у вас есть сгенерированный Subsonic класс Product. Создайте новый файл Product.cs в вашей расширенной (или любой другой) папке, создайте частичный класс Product и убедитесь, что пространство имен совпадает с пространством имен классов, созданных дозвуковыми методами.

namespace Your.Namespace.DAL
{
    public partial class Product
    {
    }
}

Теперь у вас есть возможность расширить класс продукта. Интересно то, что дозвуковой режим предлагает некоторые методы для отмены.

namespace Your.Namespace.DAL
{
    public partial class Product
    {

        public override bool Validate()
        {

            ValidateColumnSettings();

            if (string.IsNullOrEmpty(this.ProductName))
                this.Errors.Add("ProductName cannot be empty");

            return Errors.Count == 0;
        }

        // another way
        protected override void BeforeValidate()
        {
            if (string.IsNullOrEmpty(this.ProductName))
                throw new Exception("ProductName cannot be empty");
        }

        protected override void BeforeInsert()
        {
           this.ProductUUID = Guid.NewGuid().ToString();
        }

        protected override void BeforeUpdate()
        {
           this.Total = this.Net + this.Tax;
        }

        protected override void AfterCommit()
        {
            DB.Update<ProductSales>()
                  .Set(ProductSales.ProductName).EqualTo(this.ProductName)
                  .Where(ProductSales.ProductId).IsEqualTo(this.ProductId)
                  .Execute();
        }

    }
}
person Jürgen Steinblock    schedule 06.10.2010

В ответ на вопрос Дэна:

Сначала взгляните здесь: http://github.com/subsonic/SubSonic-2.0/blob/master/SubSonic/ActiveRecord/ActiveRecord.cs

В этом файле живет вся логика, которую я показал в другом посте.

  • Validate: вызывается во время Save (), если Validate () возвращает false, генерируется исключение. Get вызывается только в том случае, если свойство ValidateWhenSaving (которое является константой, поэтому вам нужно перекомпилировать SubSonic, чтобы изменить его) истинно (по умолчанию)

  • BeforeValidate: вызывается во время Save (), когда ValidateWhenSaving имеет значение true. По умолчанию ничего не делает

  • BeforeInsert: вызывается во время Save (), если запись новая. По умолчанию ничего не делает.

  • BeforeUpdate: вызывается во время Save (), если запись новая. По умолчанию ничего не делает.

  • AfterCommit: вызывается после успешной вставки / обновления записи. По умолчанию ничего не делает.

В моем примере с Validate () я сначала разрешил запускать метод ValidatColumnSettings () по умолчанию, который добавит ошибки типа «Превышена максимальная длина строки для столбца ProductName», если имя продукта длиннее, чем значение, определенное в базе данных. Затем я добавляю еще одну строку ошибок, если ProductName пусто, и возвращаю false, если общее количество ошибок больше нуля.

Это вызовет исключение во время Save (), поэтому вы не сможете сохранить запись в БД.

Я бы посоветовал вам вызвать Validate () самостоятельно, и если он вернет false, вы отобразите элементы this. Ошибки внизу страницы (простой способ) или (более элегантно) вы создадите Dictionary<string, string>, где ключом является имя столбца, а ценность - причина.

    private Dictionary<string, string> CustomErrors = new Dictionary<string, string>
    protected override bool Validate()
    {

        this.CustomErrors.Clear();
        ValidateColumnSettings();

        if (string.IsNullOrEmpty(this.ProductName))
            this.CustomErrors.Add(this.Columns.ProductName, "cannot be empty");

        if (this.UnitPrice < 0)
            this.CustomErrors.Add(this.Columns.UnitPrice, "has to be 0 or bigger");

        return this.CustomErrors.Count == 0 && Errors.Count == 0;
    }

Затем, если Validate () вернет false, вы можете добавить причину непосредственно рядом / под правым полем на вашей веб-странице.

Если Validate () возвращает true, вы можете безопасно вызвать Save (), но имейте в виду, что Save () может вызывать другие ошибки во время сохранения, такие как «Dublicate Key ...»;

person Jürgen Steinblock    schedule 07.10.2010

Спасибо за ответ, но можете ли вы подтвердить это для меня, так как я немного запутался, если ваша проверка значения столбца (ProductName) в validate () или beforevalidate () пустая строка или NULL, это не означает, что вставка / обновление уже были выполнены действия, так как в противном случае он не знал бы, что вы пытались вставить или обновить нулевое значение из полей UI / aspx на странице в столбец ??

Кроме того, в событиях вставки или обновления asp.net мы используем e.cancel = true, чтобы остановить обновление вставки, если beforevalidate failes автоматически останавливает действие вставки или обновления?

Если это так, не лучше добавить проверку на уровне страницы, чтобы в первую очередь остановить запуск вставки или обновления.

Я думаю, я немного запутался в жизненном цикле этих методов и в том, когда они вступают в игру.

person Dan    schedule 06.10.2010
comment
Я добавил еще один пост с более подробными пояснениями - person Jürgen Steinblock; 07.10.2010