一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

ASP.NET 2.0數據教程之二:創建一個業務邏輯層

系列文章導航:

ASP.NET 2.0數據教程之一:創建一個數據訪問層

ASP.NET 2.0數據教程之二:創建一個業務邏輯層

ASP.NET 2.0數據教程之三:母板頁和站點導航

ASP.NET 2.0數據教程之四:使用ObjectDataSource展現數據

ASP.NET 2.0數據教程之五:聲明參數

ASP.NET 2.0數據教程之六:編程設置ObjectDataSource的參數值

ASP.NET 2.0數據教程之七:使用DropDownList過濾的主/從報表

ASP.NET 2.0數據教程之八:使用兩個DropDownList過濾的主/從報表

ASP.NET 2.0數據教程之九:跨頁面的主/從報表

ASP.NET 2.0數據教程之十:使用 GridView 和DetailView實現的主/從報表

ASP.NET 2.0數據教程之十一:基于數據的自定義格式化

ASP.NET 2.0數據教程之十二:在GridView控件中使用TemplateField


ASP.NET 2.0中操作數據:創建一個業務邏輯層

英文原版  |   本教程的代碼(C#)   |   翻譯目錄   |   原文目錄

導言

教程的第一節所描述的數據訪問層(Data Access Layer,以下簡稱為DAL)已經清晰地將表示邏輯與數據訪問邏輯區分開了。不過,即使DAL將數據訪問的細節從表示層中分離出來了,可它卻不能處理任何的業務規則。比如說,我們可能不希望產品表中那些被標記為“停用”的產品的“分類編號”“供應商編號”被更新;我們還可能需要應用一些資歷規則,比如說我們都不希望被比自己的資歷還要淺的人管理。另外一個比較常見的情況就是授權,比如說只有那些具有特殊權限的用戶可以刪除產品或是更改單價。

我們其實可以將業務邏輯層(Business Logic Layer,以下簡稱BLL)看作是在數據訪問層和表示層之間進行數據交換的橋梁,在這個章節中,我們將討論一下如何將這些業務規則集成到一個BLL中。需要說明的是,在一個實際的應用程序中,BLL都是以類庫(Class Library)的形式來實現的,不過為了簡化工程的結構,在本教程中我們將BLL實現為App_Code文件夾中的一系列的類。圖一向我們展示了表示層、BLL以及DAL三者之間的結構關系。


圖一:BLL將表示層與DAL隔開了,并且加入了業務規則

系列文章導航:

ASP.NET 2.0數據教程之一:創建一個數據訪問層

ASP.NET 2.0數據教程之二:創建一個業務邏輯層

ASP.NET 2.0數據教程之三:母板頁和站點導航

ASP.NET 2.0數據教程之四:使用ObjectDataSource展現數據

ASP.NET 2.0數據教程之五:聲明參數

ASP.NET 2.0數據教程之六:編程設置ObjectDataSource的參數值

ASP.NET 2.0數據教程之七:使用DropDownList過濾的主/從報表

ASP.NET 2.0數據教程之八:使用兩個DropDownList過濾的主/從報表

ASP.NET 2.0數據教程之九:跨頁面的主/從報表

ASP.NET 2.0數據教程之十:使用 GridView 和DetailView實現的主/從報表

ASP.NET 2.0數據教程之十一:基于數據的自定義格式化

ASP.NET 2.0數據教程之十二:在GridView控件中使用TemplateField


第一步:創建BLL類

我們的BLL4個類組成,每一個BLL類都對應DAL中的一個TableAdapter,它們都從各自的TableAdapter中得到讀取、插入、修改以及刪除等方法以應用合適的業務規則。

為了更加清晰的區分DALBLL的類,我們在App_Code文件夾中建立兩個子文件夾,分別命名為DALBLL。你僅僅需要在解決方案瀏覽器(Solution Explorer)中右鍵點擊App_Code文件夾,并選擇新建文件夾(New Folder),就可以創建新的子文件夾了。建好了這兩個文件夾之后,把第一節中所創建的類型化數據集(Typed DataSet)移到DAL文件夾中。

然后,在BLL文件夾中創建4個類文件。同樣,你僅僅需要在解決方案瀏覽器(Solution Explorer)中右鍵點擊BLL文件夾,并選擇新建項目(New Item),然后在彈出的對話框中選擇類模板(Class template)就可以創建新的類文件了。將這四個文件分別命名為ProductsBLLCategoriesBLLSuppliersBLL以及EmployeesBLL



圖二:在BLL文件夾中添加4個新的類

接下來,讓我們來給這些新建的類加上一些方法,簡單的將第一節中的TableAdapter中的那些方法包裝起來就行了。現在,這些方法將只能直接使用DAL中的那些方法,我們等會再來給他們加上一些業務邏輯。

注意:如果你使用的是Visual Studio 標準版或以上版本(也就是說,你不是用的Visual Web Developer),那么你還可以使用Class Designer來可視化的設計你的類。你可以在Class Designer Blog上得到關于Visual Studio的這項新功能的詳細信息。

ProductsBLL類中,我們一共需要為其添加7個方法:

l         GetProducts() – 返回所有的產品

l         GetProductByProductID(productID) – 返回指定ProductID的產品

l         GetProductsByCategoryID(categoryID) –返回指定分類的產品

l         GetProductsBySupplier(supplierID) –返回指定供應商的產品

l         AddProduct(productName, supplierID, categoryID, quantityPerUnit, unitPrice, unitsInStock, unitsOnOrder, reorderLevel, discontinued) – 向數據庫中添加一條產品信息,并返回新添加的產品的ProductID

l         UpdateProduct(productName, supplierID, categoryID, quantityPerUnit, unitPrice, unitsInStock, unitsOnOrder, reorderLevel, discontinued, productID) – 更新一個數據庫中已經存在的產品,如果剛好更新了一條記錄,則返回true,否則返回false

l         DeleteProduct(productID) – 刪除指定ProductID的產品

 

ProductsBLL.cs

系列文章導航:

ASP.NET 2.0數據教程之一:創建一個數據訪問層

ASP.NET 2.0數據教程之二:創建一個業務邏輯層

ASP.NET 2.0數據教程之三:母板頁和站點導航

ASP.NET 2.0數據教程之四:使用ObjectDataSource展現數據

ASP.NET 2.0數據教程之五:聲明參數

ASP.NET 2.0數據教程之六:編程設置ObjectDataSource的參數值

ASP.NET 2.0數據教程之七:使用DropDownList過濾的主/從報表

ASP.NET 2.0數據教程之八:使用兩個DropDownList過濾的主/從報表

ASP.NET 2.0數據教程之九:跨頁面的主/從報表

ASP.NET 2.0數據教程之十:使用 GridView 和DetailView實現的主/從報表

ASP.NET 2.0數據教程之十一:基于數據的自定義格式化

ASP.NET 2.0數據教程之十二:在GridView控件中使用TemplateField


注意:當我們在添加或更新一個產品的詳細信息時,都是接受由產品信息組成的一個標量列表,而不是直接接受一個ProductsRow實例。因為ProductsRow是繼承于ADO.NETDataRow,而DataRow沒有默認的無參構造函數,為了創建一個ProductsRow的實例,我們必須先創建一個ProductsDataTable的實例,然后調用它的NewProductRow方法(就像我們在AddProduct方法中所做的那樣)。不過,當我在使用ObjectDataSource來插入或更新時,這樣做的缺點就會暴露出來了。簡單的講,ObjectDataSource會試圖為輸入的參數創建一個實例,如果BLL方法希望得到一個ProductsRow,那么ObjectDataSource就將會試圖去創建一個,不過很顯然,這樣的操作一定會失敗,因為沒有一個默認的無參構造函數。這個問題的詳細信息,可以在ASP.NET論壇的以下兩個帖子中找到: Updating ObjectDataSources with Strongly-Typed DataSetsProblem With ObjectDataSource and Strongly-Typed DataSet

之后,在AddProductUpdateProduct中,我們創建了一個ProductsRow實例,并將傳入的參數賦值給它。當給一個DataRowDataColumns賦值時,各種字段級的有效性驗證都有可能會被觸發。因此,我們應該手工的驗證一下傳入的參數以保證傳遞給BLL方法的數據是有效的。不幸的是,Visual Studio生成的強類型數據集(strongly-typed DataRow)并沒有使用nullable values。要表明DataRow中的一個DataColumn可以接受空值,我們就必須得使用SetColumnNameNull方法。

UpdateProduct中,我們先使用GetProductByProductID(productID)方法將需要更新的產品信息讀取出來。這樣做好像沒有什么必要,不過我們將在之后的關于并發優化(Optimistic concurrency)的課程中證明這個額外的操作是有它的作用的。并發優化是一種保證兩個用戶同時操作一個數據而不會發生沖突的技術。獲取整條記錄同時也可以使創建一個僅更新DataRow的一部分列的方法更加容易,我們可以在SuppliersBLL類中找到這樣的例子。

最后,注意我們在ProductsBLL類上面加上了DataObject 標簽(就是在類聲明語句的上面的[System.ComponentModel.DataObject]),各方法上面還有DataObjectMethodAttribute 標簽DataObject標簽把這個類標記為可以綁定到一個ObjectDataSource控件,而DataObjectMethodAttribute則說明了這個方法的目的。我們將在后面的教程中看到,ASP.NET 2.0ObjectDataSource使從一個類中訪問數據更加容易。為了ObjectDataSource向導能夠對現有的類進行合適的篩選,在類列表中默認僅顯示標記為DataObject的類。當然,其實ProductsBLL類就算沒有這個標簽也可以工作,但是加上它可以使我們在ObjectDataSource向導中的操作更加輕松和心情愉快。

系列文章導航:

ASP.NET 2.0數據教程之一:創建一個數據訪問層

ASP.NET 2.0數據教程之二:創建一個業務邏輯層

ASP.NET 2.0數據教程之三:母板頁和站點導航

ASP.NET 2.0數據教程之四:使用ObjectDataSource展現數據

ASP.NET 2.0數據教程之五:聲明參數

ASP.NET 2.0數據教程之六:編程設置ObjectDataSource的參數值

ASP.NET 2.0數據教程之七:使用DropDownList過濾的主/從報表

ASP.NET 2.0數據教程之八:使用兩個DropDownList過濾的主/從報表

ASP.NET 2.0數據教程之九:跨頁面的主/從報表

ASP.NET 2.0數據教程之十:使用 GridView 和DetailView實現的主/從報表

ASP.NET 2.0數據教程之十一:基于數據的自定義格式化

ASP.NET 2.0數據教程之十二:在GridView控件中使用TemplateField


 

添加其他的類

完成了ProductsBLL類之后,我們還要添加一些為categoriessuppliersemployees服務的類。讓我們花點時間來創建下面的類,根據上面的例子來做就是了:

 

·         CategoriesBLL.cs

o        GetCategories()

o        GetCategoryByCategoryID(categoryID)

 

·         SuppliersBLL.cs

o        GetSuppliers()

o        GetSupplierBySupplierID(supplierID)

o        GetSuppliersByCountry(country)

o        UpdateSupplierAddress(supplierID, address, city, country)

·         EmployeesBLL.cs

o        GetEmployees()

o        GetEmployeeByEmployeeID(employeeID)

o        GetEmployeesByManager(managerID)

 

SuppliersBLL類中的UpdateSupplierAddress方法是一個值得注意的東西。這個方法提供了一個僅僅更新供應商地址信息的接口。它首先根據指定的SupplierID讀出一個SupplierDataRow(使用GetSupplierBySupplierID方法),設置其關于地址的所有屬性,然后調用SupplierDataTableUpdate方法。UpdateSupplierAddress方法的代碼如下所示:

 

UpdateSupplierAddress

系列文章導航:

ASP.NET 2.0數據教程之一:創建一個數據訪問層

ASP.NET 2.0數據教程之二:創建一個業務邏輯層

ASP.NET 2.0數據教程之三:母板頁和站點導航

ASP.NET 2.0數據教程之四:使用ObjectDataSource展現數據

ASP.NET 2.0數據教程之五:聲明參數

ASP.NET 2.0數據教程之六:編程設置ObjectDataSource的參數值

ASP.NET 2.0數據教程之七:使用DropDownList過濾的主/從報表

ASP.NET 2.0數據教程之八:使用兩個DropDownList過濾的主/從報表

ASP.NET 2.0數據教程之九:跨頁面的主/從報表

ASP.NET 2.0數據教程之十:使用 GridView 和DetailView實現的主/從報表

ASP.NET 2.0數據教程之十一:基于數據的自定義格式化

ASP.NET 2.0數據教程之十二:在GridView控件中使用TemplateField



第二步:通過BLL類訪問類型化數據集

 

在本教程的第一節中,我們給出了直接使用類型化數據集的例子,不過在我們添加了BLL類之后,表示層就可以通過BLL來工作了。在本教程的第一節中的AllProducts.ASPx的例子中,ProductsTableAdapter用于將產品列表綁定到GridView上,代碼如下所示:

 

1 ProductsTableAdapter productsAdapter = new ProductsTableAdapter();
2 GridView1.DataSource = productsAdapter.GetProducts();
3 GridView1.DataBind();

系列文章導航:

ASP.NET 2.0數據教程之一:創建一個數據訪問層

ASP.NET 2.0數據教程之二:創建一個業務邏輯層

ASP.NET 2.0數據教程之三:母板頁和站點導航

ASP.NET 2.0數據教程之四:使用ObjectDataSource展現數據

ASP.NET 2.0數據教程之五:聲明參數

ASP.NET 2.0數據教程之六:編程設置ObjectDataSource的參數值

ASP.NET 2.0數據教程之七:使用DropDownList過濾的主/從報表

ASP.NET 2.0數據教程之八:使用兩個DropDownList過濾的主/從報表

ASP.NET 2.0數據教程之九:跨頁面的主/從報表

ASP.NET 2.0數據教程之十:使用 GridView 和DetailView實現的主/從報表

ASP.NET 2.0數據教程之十一:基于數據的自定義格式化

ASP.NET 2.0數據教程之十二:在GridView控件中使用TemplateField



第三步:給DataRow添加字段級驗證

 

字段級驗證是指在插入或更新時檢查業務對象所涉及到的所有屬性值。拿產品來舉個例,某些字段級的驗證規則如下所示:

 

·         ProductName字段不得超過40個字符

·         QuantityPerUnit字段不得超過20個字符

·         ProductIDProductName以及Discontinued字段是必填的,而其他字段則是可填可不填的

·         UnitPriceUnitsInStockUnitsOnOrder以及ReorderLevel字段不得小于0

 

這些規則可以或者說是應該在數據庫層被描述出來。ProductNameQuantityPerUnit字段上的字符數限制可以通過Products表中相應列的數據類型來實現(分別為nvarchar(40) and nvarchar(20))。字段“是否必填”可以通過將數據庫中表的相應列設置為“允許為NULL”來實現。為了保證UnitPriceUnitsInStockUnitsOnOrder以及ReorderLevel字段的值不小于0,可以分別在它們的相應列上加一個約束

 

除了在數據庫中應用了這些規則之外,它們同時也將被其應用DataSet上。事實上,字段長度和是否允許為空等信息已經被應用到了各DataTableDataColumn集合中。我們可以在數據集設計器(DataSet Designer)中看到已經存在的字段級驗證,從某個DataTable中選擇一個字段,然后在屬性窗口中就可以找到了。如圖四所示,ProductDataTable中的QuantityPerUnit字段允許空值并且最大長度為20各字符。如果我們試圖給某個ProductsDataRowQuantityPerUnit屬性設置一個長度大于20個字符的字符串,將會有一個ArgumentException被拋出。



圖四:DataColumn提供了基本的字段級驗證

不幸的是,我們不能通過屬性窗口指定一個邊界檢查,比如UnitPrice的值不能小于0。為了提供這樣的字段級驗證,我們需要為DataTableColumnChanging事件建立一個Event Handler。正如上一節教程中所提到的那樣,由類型化數據集創建的DataSetDataTable還有DataRow對象可以通過partial類來進行擴展。使用這個技術,我們可以為ProductDataTable創建一個ColumnChangingEvent Handler。我們先在App_Code文件夾中新建一個名為ProductsDataTable.ColumnChanging.cs的類文件,如下圖所示。



圖五:在App_Code文件夾中添加新類

然后,給ColumnChanging事件創建一個Event handler,以保證UnitPriceUnitsInStockUnitsOnOrder以及ReorderLevel字段的值不小于0。如果這些列的值超出范圍就拋出一個ArgumentException

 

ProductsDataTable.ColumnChanging.cs

系列文章導航:

ASP.NET 2.0數據教程之一:創建一個數據訪問層

ASP.NET 2.0數據教程之二:創建一個業務邏輯層

ASP.NET 2.0數據教程之三:母板頁和站點導航

ASP.NET 2.0數據教程之四:使用ObjectDataSource展現數據

ASP.NET 2.0數據教程之五:聲明參數

ASP.NET 2.0數據教程之六:編程設置ObjectDataSource的參數值

ASP.NET 2.0數據教程之七:使用DropDownList過濾的主/從報表

ASP.NET 2.0數據教程之八:使用兩個DropDownList過濾的主/從報表

ASP.NET 2.0數據教程之九:跨頁面的主/從報表

ASP.NET 2.0數據教程之十:使用 GridView 和DetailView實現的主/從報表

ASP.NET 2.0數據教程之十一:基于數據的自定義格式化

ASP.NET 2.0數據教程之十二:在GridView控件中使用TemplateField



第四步:給BLL類添加業務規則

 

除了字段級的驗證,可能還有一些不能在單個列中表示的包含不同實體或概念的更高級的業務規則,比如:

 

·         如果一個產品被標記為“停用”,那么它的單價就不能被修改

·         一個雇員的居住地必須與他(她)的主管的居住地相同

·         如果某個產品是某供應商唯一提供的產品,那么這個產品就不能被標記為“停用”

 

BLL類應該保證始終都驗證應用程序的業務規則。這些驗證可以直接的添加到應用他們的方法中。

 

想象一下,我們的業務規則表明了如果一個產品是給定的供應商的唯一產品,那么它就不能被標記為“停用”。也就是說,如果產品X是我們從供應商Y處購買的唯一一個產品,那么我們就不能將X標記為停用;然而,如果供應商Y提供給我們的一共有3樣產品,分別是ABC,那么我們可以將其中任何一個或者三個全部都標記為“停用”。挺奇怪的業務規則,是吧?但是商業上的規則通常就是跟我們平常的感覺不太一樣。

 

要在UpdateProducts方法中應用這個業務規則,那么我們就應該先檢查Discontinued是否被設置為true。假如是這樣的話,那么我們應該先調用GetProductsBySupplierID來看看我們從這個供應商處一共購買了多少產品。如果我們僅僅從這個供應商處購買了這一個產品,那么我們就拋出一個ApplicationException

 

UpdateProduct

NET技術ASP.NET 2.0數據教程之二:創建一個業務邏輯層,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 国产成人久久精品激情 | 国产欧美另类久久久品 | 在线色资源 | 怡红院亚洲 | 久久综合色网 | 精品久久久久香蕉网 | 久久久久久久一精品 | 一区二区视频在线观看高清视频在线 | 国产福利写真视频在线观看 | 怡红院日本 | 污污网站免费入口链接 | 美女视频黄的免费 | 国产高清视频免费最新在线 | 美女胸又大又www又黄的网站 | 国产在线小视频 | 国产美女一区二区三区 | 亚洲国产精品日韩高清秒播 | 国产一区二区在线观看免费 | 真人视频一级毛片 | 国产99热在线观看 | www.色.con| 色噜噜狠狠在爱丁香 | 欧美在线视频网站 | 一二三四在线播放免费视频中国 | 久久久久久久亚洲精品 | 国产成人久久精品麻豆二区 | 国产麻豆精品一区二区 | 国产视频麻豆 | 午夜欧美激情 | 中文字幕一区二区三区5566 | 大香伊人久久 | 亚洲日本中文字幕在线2022 | 都市激情亚洲色图 | 看全色黄大色黄大片视频 | 中文字幕久久久久久久系列 | 精品国产网红福利在线观看 | 欧美一级成人免费大片 | 国内精品久久久久久久星辰影视 | 国产精品v欧美精品v日韩 | 亚洲精品xxx| 韩国美女爽快一级毛片黄 |