Робота з даними в ASP.NET. Створення рівня бізнес-логіки, Різне, Програмування, статті

Передмова

Це друга стаття з серії “Робота з Даними в ASP.NET “. У даній статті ми розглянемо створення в проіложеніі рівня бізнес-логіки. Це дуже важливий момент при створення складних додатків, тому що саме в рівні бізнес логіки здійснюються таки необхідні процеси, як авторизація, перевірка введених даних і т.п. За основу статті взято матеріал Скота Мітчелла “Creating
a Business Logic Layer”.

Введення

У першій статті ми з вами створили рівень доступу до даних (DAL), який виносив логіку доступу до даних з рівня подання. Але це не дозволить нам застосувати будь-які бізнес правила. Наприклад, нам потрібно заборонити можливість зміни полів CategoryID і
SupplierID
таблиці Products якщо поле Discontinued дорівнює 1. Інший приклад – авторизація користувачів.

З даної статті ви дізнаєтеся як централізувати всю бізнес логіку програми в спеціальному рівні – рівні бізнес логіки (Business Logic Layer, BLL). BLL розташовується між рівнем представлення і рівнем доступу до даних

Тепер напишемо обробник події ColumnChanging, в якому перевіримо, щоб значення полів UnitPrice, UnitsInStock, UnitsOnOrder і ReorderLevel, якщо вони не рівні NULL, були б більше або дорівнюють нулю:

public partial class Northwind

{

    public partial class ProductsDataTable

    {

        public override void BeginInit()

        {

            this.ColumnChanging +=
ValidateColumn;

        }

        void ValidateColumn(object sender,
DataColumnChangeEventArgs e)

        {

            if (e.Column.Equals(this.UnitPriceColumn))

            {

                if (!Convert.IsDBNull(e.ProposedValue)
&& (decimal)e.ProposedValue < 0)

                {

                    throw new
ArgumentException(“UnitPrice cannot be less
than zero”, “UnitPrice”);

                }

            }

            else if (e.Column.Equals(this.UnitsInStockColumn)
// e.Column.Equals(this.UnitsOnOrderColumn)

                // e.Column.Equals(this.ReorderLevelColumn))

            {

                if (!Convert.IsDBNull(e.ProposedValue)
&& (short)e.ProposedValue < 0)

                {

                    throw new
ArgumentException(string.Format(“{0} cannot
be less than zero”, e.Column.ColumnName),
e.Column.ColumnName);

                }

            }

        }

    }

}

Крок 4. Додавання власних бізнес правил в BLL класи

Часто необхідно створити для програми набір певних правил, наприклад:

За перевірку дотримання таких правил і відповідає BLL.

Розглянемо все на прикладі. Припустимо, що у нас є бізнес-правило, згідно яким продаж товару не може бути припинена, якщо це єдиний товар, що поставляється від конкретного постачальника. Тобто, є товар А, єдиний товар, який постачає постачальник Б, ми не можемо призупинити продаж товару А, окрім як якщо постачальник Б не поставить нам ще й товари В, Г і Д, тоді ми зможемо призупинити продаж будь-якого з цих продуктів.

Для дотримання цього правила ми змінимо код методу UpdateProducts. Якщо властивість discontinued встановлено в
true, І якщо постачальник, який поставляє нам цей товар не постачає більше ніяких інших товарів, то буде виконано виключення додатку (ApplicationException)

    [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Update,
true)]

    public bool UpdateProduct(string
ProductName, int? supplierID, int?
CategoryID, string QuantityPerUnit, decimal?
unitPrice,

        short? UnitsInStock, short?
UnitsOnOrder, short? ReorderLevel, bool
Discontinued, int ProductID)

    {

        Northwind.ProductsDataTable products
= Adapter.GetProductsByProductID(ProductID);

        if (products.Count == 0)

            return false;

        Northwind.ProductsRow product =
products[0];

        if (Discontinued)

        {

            Northwind.ProductsDataTable
productsBySupplier =
Adapter.GetProductsBySupplierID(product.SupplierID);

            if (productsBySupplier.Count ==
1)

                throw new
ApplicationException(“You cannot mark a
product as discontinued if it is the only
product purchased from a supplier”);

        }

        product.ProductName = ProductName;

        if (supplierID == null)
product.SetSupplierIDNull();

        else product.SupplierID =
supplierID.Value;

        if (CategoryID == null)
product.SetCategoryIDNull();

        else product.CategoryID =
CategoryID.Value;

        if (QuantityPerUnit == null)
product.SetQuantityPerUnitNull();

        else product.QuantityPerUnit =
QuantityPerUnit;

        if (unitPrice == null)
product.SetUnitPriceNull();

        else product.UnitPrice =
unitPrice.Value;

        if (UnitsInStock == null)
product.SetUnitsInStockNull();

        else product.UnitsInStock =
UnitsInStock.Value;

        if (UnitsOnOrder == null)
product.SetUnitsOnOrderNull();

        else product.UnitsOnOrder =
UnitsOnOrder.Value;

        if (ReorderLevel == null)
product.SetReorderLevelNull();

        else product.ReorderLevel =
ReorderLevel.Value;

        product.Discontinued = Discontinued;

        int rowsAffected = Adapter.Update(product);

        return rowsAffected == 1;

    }

 

Відстеження помилок на рівні програми

Для більш стабільної роботи прідложенія варто все “нестійкі” коди обрамляти в блок catch…try, і в разі помилки обробляти ісключіеніе.

        ProductsBLL productLogic = new
ProductsBLL();

        try

        {

            // This will fail since we are
attempting to use a

            // UnitPrice value less than 0.

            productLogic.UpdateProduct( “Scott
s Tea”, 1, 1, null, -14m, 10, null, null,
false, 1);

        }

        catch (ArgumentException ae)

        {

            Response.Write(“There was a
problem: ” + ae.Message);

        }

Висновок

Гарне додаток завжди повинно бути розділене на кілька рівнів, кожен з яких повинен виконувати певну роль. У даній статті ми розглянули рівень бізнес логіки, в якому визначаються бізнес правила застосування. Ми реалізували це шляхом створення декількох класів, для кожного TableAdapter. Зазвичай вся бізнес логіка виноситься в окремий проект ClassLibrary.

Тепер у нас готові рівні доступу до даними і рівень бізнес логіки і ми цілком можемо приступити до створення рівня подання. Чим і займемося в наступній статті =)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*