Робота з даними в 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.
Тепер у нас готові рівні доступу до даними і рівень бізнес логіки і ми цілком можемо приступити до створення рівня подання. Чим і займемося в наступній статті =)
Схожі статті:
- Веб 2.0 порівнюють з комунізмом. (0)
- М'яке підвищення ІЦ та PR (0)
- Web 2.0 і бізнес (0)
- Чим відрізняються id і class (0)
- Скільки коштує Windows Vista? Оцінка THG (0)
- Rational Rose для розробників. Частина 3 (0)
- Практика реалізації модуля інтеграції для Rational Software Architect. Частина 1 (0)
Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.
Коментарів поки що немає.
Ваш отзыв
Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>