中文字幕日韩一区二区_国产一区二区av_国产毛片av_久久久久国产一区_色婷婷电影_国产一区二区精品

ASP.NET 2.0數(shù)據(jù)教程之二:創(chuàng)建一個(gè)業(yè)務(wù)邏輯層

系列文章導(dǎo)航:

ASP.NET 2.0數(shù)據(jù)教程之一:創(chuàng)建一個(gè)數(shù)據(jù)訪問(wèn)層

ASP.NET 2.0數(shù)據(jù)教程之二:創(chuàng)建一個(gè)業(yè)務(wù)邏輯層

ASP.NET 2.0數(shù)據(jù)教程之三:母板頁(yè)和站點(diǎn)導(dǎo)航

ASP.NET 2.0數(shù)據(jù)教程之四:使用ObjectDataSource展現(xiàn)數(shù)據(jù)

ASP.NET 2.0數(shù)據(jù)教程之五:聲明參數(shù)

ASP.NET 2.0數(shù)據(jù)教程之六:編程設(shè)置ObjectDataSource的參數(shù)值

ASP.NET 2.0數(shù)據(jù)教程之七:使用DropDownList過(guò)濾的主/從報(bào)表

ASP.NET 2.0數(shù)據(jù)教程之八:使用兩個(gè)DropDownList過(guò)濾的主/從報(bào)表

ASP.NET 2.0數(shù)據(jù)教程之九:跨頁(yè)面的主/從報(bào)表

ASP.NET 2.0數(shù)據(jù)教程之十:使用 GridView 和DetailView實(shí)現(xiàn)的主/從報(bào)表

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

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


ASP.NET 2.0中操作數(shù)據(jù):創(chuàng)建一個(gè)業(yè)務(wù)邏輯層

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

導(dǎo)言

教程的第一節(jié)所描述的數(shù)據(jù)訪問(wèn)層(Data Access Layer,以下簡(jiǎn)稱(chēng)為DAL)已經(jīng)清晰地將表示邏輯與數(shù)據(jù)訪問(wèn)邏輯區(qū)分開(kāi)了。不過(guò),即使DAL將數(shù)據(jù)訪問(wèn)的細(xì)節(jié)從表示層中分離出來(lái)了,可它卻不能處理任何的業(yè)務(wù)規(guī)則。比如說(shuō),我們可能不希望產(chǎn)品表中那些被標(biāo)記為“停用”的產(chǎn)品的“分類(lèi)編號(hào)”“供應(yīng)商編號(hào)”被更新;我們還可能需要應(yīng)用一些資歷規(guī)則,比如說(shuō)我們都不希望被比自己的資歷還要淺的人管理。另外一個(gè)比較常見(jiàn)的情況就是授權(quán),比如說(shuō)只有那些具有特殊權(quán)限的用戶(hù)可以刪除產(chǎn)品或是更改單價(jià)。

我們其實(shí)可以將業(yè)務(wù)邏輯層(Business Logic Layer,以下簡(jiǎn)稱(chēng)BLL)看作是在數(shù)據(jù)訪問(wèn)層和表示層之間進(jìn)行數(shù)據(jù)交換的橋梁,在這個(gè)章節(jié)中,我們將討論一下如何將這些業(yè)務(wù)規(guī)則集成到一個(gè)BLL中。需要說(shuō)明的是,在一個(gè)實(shí)際的應(yīng)用程序中,BLL都是以類(lèi)庫(kù)(Class Library)的形式來(lái)實(shí)現(xiàn)的,不過(guò)為了簡(jiǎn)化工程的結(jié)構(gòu),在本教程中我們將BLL實(shí)現(xiàn)為App_Code文件夾中的一系列的類(lèi)。圖一向我們展示了表示層、BLL以及DAL三者之間的結(jié)構(gòu)關(guān)系。


圖一:BLL將表示層與DAL隔開(kāi)了,并且加入了業(yè)務(wù)規(guī)則

系列文章導(dǎo)航:

ASP.NET 2.0數(shù)據(jù)教程之一:創(chuàng)建一個(gè)數(shù)據(jù)訪問(wèn)層

ASP.NET 2.0數(shù)據(jù)教程之二:創(chuàng)建一個(gè)業(yè)務(wù)邏輯層

ASP.NET 2.0數(shù)據(jù)教程之三:母板頁(yè)和站點(diǎn)導(dǎo)航

ASP.NET 2.0數(shù)據(jù)教程之四:使用ObjectDataSource展現(xiàn)數(shù)據(jù)

ASP.NET 2.0數(shù)據(jù)教程之五:聲明參數(shù)

ASP.NET 2.0數(shù)據(jù)教程之六:編程設(shè)置ObjectDataSource的參數(shù)值

ASP.NET 2.0數(shù)據(jù)教程之七:使用DropDownList過(guò)濾的主/從報(bào)表

ASP.NET 2.0數(shù)據(jù)教程之八:使用兩個(gè)DropDownList過(guò)濾的主/從報(bào)表

ASP.NET 2.0數(shù)據(jù)教程之九:跨頁(yè)面的主/從報(bào)表

ASP.NET 2.0數(shù)據(jù)教程之十:使用 GridView 和DetailView實(shí)現(xiàn)的主/從報(bào)表

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

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


第一步:創(chuàng)建BLL類(lèi)

我們的BLL4個(gè)類(lèi)組成,每一個(gè)BLL類(lèi)都對(duì)應(yīng)DAL中的一個(gè)TableAdapter,它們都從各自的TableAdapter中得到讀取、插入、修改以及刪除等方法以應(yīng)用合適的業(yè)務(wù)規(guī)則。

為了更加清晰的區(qū)分DALBLL的類(lèi),我們?cè)?/span>App_Code文件夾中建立兩個(gè)子文件夾,分別命名為DALBLL。你僅僅需要在解決方案瀏覽器(Solution Explorer)中右鍵點(diǎn)擊App_Code文件夾,并選擇新建文件夾(New Folder),就可以創(chuàng)建新的子文件夾了。建好了這兩個(gè)文件夾之后,把第一節(jié)中所創(chuàng)建的類(lèi)型化數(shù)據(jù)集(Typed DataSet)移到DAL文件夾中。

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



圖二:在BLL文件夾中添加4個(gè)新的類(lèi)

接下來(lái),讓我們來(lái)給這些新建的類(lèi)加上一些方法,簡(jiǎn)單的將第一節(jié)中的TableAdapter中的那些方法包裝起來(lái)就行了。現(xiàn)在,這些方法將只能直接使用DAL中的那些方法,我們等會(huì)再來(lái)給他們加上一些業(yè)務(wù)邏輯。

注意:如果你使用的是Visual Studio 標(biāo)準(zhǔn)版或以上版本(也就是說(shuō),你不是用的Visual Web Developer),那么你還可以使用Class Designer來(lái)可視化的設(shè)計(jì)你的類(lèi)。你可以在Class Designer Blog上得到關(guān)于Visual Studio的這項(xiàng)新功能的詳細(xì)信息。

ProductsBLL類(lèi)中,我們一共需要為其添加7個(gè)方法:

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

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

l         GetProductsByCategoryID(categoryID) –返回指定分類(lèi)的產(chǎn)品

l         GetProductsBySupplier(supplierID) –返回指定供應(yīng)商的產(chǎn)品

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

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

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

 

ProductsBLL.cs

系列文章導(dǎo)航:

ASP.NET 2.0數(shù)據(jù)教程之一:創(chuàng)建一個(gè)數(shù)據(jù)訪問(wèn)層

ASP.NET 2.0數(shù)據(jù)教程之二:創(chuàng)建一個(gè)業(yè)務(wù)邏輯層

ASP.NET 2.0數(shù)據(jù)教程之三:母板頁(yè)和站點(diǎn)導(dǎo)航

ASP.NET 2.0數(shù)據(jù)教程之四:使用ObjectDataSource展現(xiàn)數(shù)據(jù)

ASP.NET 2.0數(shù)據(jù)教程之五:聲明參數(shù)

ASP.NET 2.0數(shù)據(jù)教程之六:編程設(shè)置ObjectDataSource的參數(shù)值

ASP.NET 2.0數(shù)據(jù)教程之七:使用DropDownList過(guò)濾的主/從報(bào)表

ASP.NET 2.0數(shù)據(jù)教程之八:使用兩個(gè)DropDownList過(guò)濾的主/從報(bào)表

ASP.NET 2.0數(shù)據(jù)教程之九:跨頁(yè)面的主/從報(bào)表

ASP.NET 2.0數(shù)據(jù)教程之十:使用 GridView 和DetailView實(shí)現(xiàn)的主/從報(bào)表

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

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


注意:當(dāng)我們?cè)谔砑踊蚋乱粋€(gè)產(chǎn)品的詳細(xì)信息時(shí),都是接受由產(chǎn)品信息組成的一個(gè)標(biāo)量列表,而不是直接接受一個(gè)ProductsRow實(shí)例。因?yàn)?/span>ProductsRow是繼承于ADO.NETDataRow,而DataRow沒(méi)有默認(rèn)的無(wú)參構(gòu)造函數(shù),為了創(chuàng)建一個(gè)ProductsRow的實(shí)例,我們必須先創(chuàng)建一個(gè)ProductsDataTable的實(shí)例,然后調(diào)用它的NewProductRow方法(就像我們?cè)?/span>AddProduct方法中所做的那樣)。不過(guò),當(dāng)我在使用ObjectDataSource來(lái)插入或更新時(shí),這樣做的缺點(diǎn)就會(huì)暴露出來(lái)了。簡(jiǎn)單的講,ObjectDataSource會(huì)試圖為輸入的參數(shù)創(chuàng)建一個(gè)實(shí)例,如果BLL方法希望得到一個(gè)ProductsRow,那么ObjectDataSource就將會(huì)試圖去創(chuàng)建一個(gè),不過(guò)很顯然,這樣的操作一定會(huì)失敗,因?yàn)闆](méi)有一個(gè)默認(rèn)的無(wú)參構(gòu)造函數(shù)。這個(gè)問(wèn)題的詳細(xì)信息,可以在ASP.NET論壇的以下兩個(gè)帖子中找到: Updating ObjectDataSources with Strongly-Typed DataSetsProblem With ObjectDataSource and Strongly-Typed DataSet

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

UpdateProduct中,我們先使用GetProductByProductID(productID)方法將需要更新的產(chǎn)品信息讀取出來(lái)。這樣做好像沒(méi)有什么必要,不過(guò)我們將在之后的關(guān)于并發(fā)優(yōu)化(Optimistic concurrency)的課程中證明這個(gè)額外的操作是有它的作用的。并發(fā)優(yōu)化是一種保證兩個(gè)用戶(hù)同時(shí)操作一個(gè)數(shù)據(jù)而不會(huì)發(fā)生沖突的技術(shù)。獲取整條記錄同時(shí)也可以使創(chuàng)建一個(gè)僅更新DataRow的一部分列的方法更加容易,我們可以在SuppliersBLL類(lèi)中找到這樣的例子。

最后,注意我們?cè)?/span>ProductsBLL類(lèi)上面加上了DataObject 標(biāo)簽(就是在類(lèi)聲明語(yǔ)句的上面的[System.ComponentModel.DataObject]),各方法上面還有DataObjectMethodAttribute 標(biāo)簽DataObject標(biāo)簽把這個(gè)類(lèi)標(biāo)記為可以綁定到一個(gè)ObjectDataSource控件,而DataObjectMethodAttribute則說(shuō)明了這個(gè)方法的目的。我們將在后面的教程中看到,ASP.NET 2.0ObjectDataSource使從一個(gè)類(lèi)中訪問(wèn)數(shù)據(jù)更加容易。為了ObjectDataSource向?qū)軌驅(qū)ΜF(xiàn)有的類(lèi)進(jìn)行合適的篩選,在類(lèi)列表中默認(rèn)僅顯示標(biāo)記為DataObject的類(lèi)。當(dāng)然,其實(shí)ProductsBLL類(lèi)就算沒(méi)有這個(gè)標(biāo)簽也可以工作,但是加上它可以使我們?cè)?/span>ObjectDataSource向?qū)е械牟僮鞲虞p松和心情愉快。

系列文章導(dǎo)航:

ASP.NET 2.0數(shù)據(jù)教程之一:創(chuàng)建一個(gè)數(shù)據(jù)訪問(wèn)層

ASP.NET 2.0數(shù)據(jù)教程之二:創(chuàng)建一個(gè)業(yè)務(wù)邏輯層

ASP.NET 2.0數(shù)據(jù)教程之三:母板頁(yè)和站點(diǎn)導(dǎo)航

ASP.NET 2.0數(shù)據(jù)教程之四:使用ObjectDataSource展現(xiàn)數(shù)據(jù)

ASP.NET 2.0數(shù)據(jù)教程之五:聲明參數(shù)

ASP.NET 2.0數(shù)據(jù)教程之六:編程設(shè)置ObjectDataSource的參數(shù)值

ASP.NET 2.0數(shù)據(jù)教程之七:使用DropDownList過(guò)濾的主/從報(bào)表

ASP.NET 2.0數(shù)據(jù)教程之八:使用兩個(gè)DropDownList過(guò)濾的主/從報(bào)表

ASP.NET 2.0數(shù)據(jù)教程之九:跨頁(yè)面的主/從報(bào)表

ASP.NET 2.0數(shù)據(jù)教程之十:使用 GridView 和DetailView實(shí)現(xiàn)的主/從報(bào)表

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

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


 

添加其他的類(lèi)

完成了ProductsBLL類(lèi)之后,我們還要添加一些為categoriessuppliersemployees服務(wù)的類(lèi)。讓我們花點(diǎn)時(shí)間來(lái)創(chuàng)建下面的類(lèi),根據(jù)上面的例子來(lái)做就是了:

 

·         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類(lèi)中的UpdateSupplierAddress方法是一個(gè)值得注意的東西。這個(gè)方法提供了一個(gè)僅僅更新供應(yīng)商地址信息的接口。它首先根據(jù)指定的SupplierID讀出一個(gè)SupplierDataRow(使用GetSupplierBySupplierID方法),設(shè)置其關(guān)于地址的所有屬性,然后調(diào)用SupplierDataTableUpdate方法。UpdateSupplierAddress方法的代碼如下所示:

 

UpdateSupplierAddress

系列文章導(dǎo)航:

ASP.NET 2.0數(shù)據(jù)教程之一:創(chuàng)建一個(gè)數(shù)據(jù)訪問(wèn)層

ASP.NET 2.0數(shù)據(jù)教程之二:創(chuàng)建一個(gè)業(yè)務(wù)邏輯層

ASP.NET 2.0數(shù)據(jù)教程之三:母板頁(yè)和站點(diǎn)導(dǎo)航

ASP.NET 2.0數(shù)據(jù)教程之四:使用ObjectDataSource展現(xiàn)數(shù)據(jù)

ASP.NET 2.0數(shù)據(jù)教程之五:聲明參數(shù)

ASP.NET 2.0數(shù)據(jù)教程之六:編程設(shè)置ObjectDataSource的參數(shù)值

ASP.NET 2.0數(shù)據(jù)教程之七:使用DropDownList過(guò)濾的主/從報(bào)表

ASP.NET 2.0數(shù)據(jù)教程之八:使用兩個(gè)DropDownList過(guò)濾的主/從報(bào)表

ASP.NET 2.0數(shù)據(jù)教程之九:跨頁(yè)面的主/從報(bào)表

ASP.NET 2.0數(shù)據(jù)教程之十:使用 GridView 和DetailView實(shí)現(xiàn)的主/從報(bào)表

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

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



第二步:通過(guò)BLL類(lèi)訪問(wèn)類(lèi)型化數(shù)據(jù)集

 

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

 

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

系列文章導(dǎo)航:

ASP.NET 2.0數(shù)據(jù)教程之一:創(chuàng)建一個(gè)數(shù)據(jù)訪問(wèn)層

ASP.NET 2.0數(shù)據(jù)教程之二:創(chuàng)建一個(gè)業(yè)務(wù)邏輯層

ASP.NET 2.0數(shù)據(jù)教程之三:母板頁(yè)和站點(diǎn)導(dǎo)航

ASP.NET 2.0數(shù)據(jù)教程之四:使用ObjectDataSource展現(xiàn)數(shù)據(jù)

ASP.NET 2.0數(shù)據(jù)教程之五:聲明參數(shù)

ASP.NET 2.0數(shù)據(jù)教程之六:編程設(shè)置ObjectDataSource的參數(shù)值

ASP.NET 2.0數(shù)據(jù)教程之七:使用DropDownList過(guò)濾的主/從報(bào)表

ASP.NET 2.0數(shù)據(jù)教程之八:使用兩個(gè)DropDownList過(guò)濾的主/從報(bào)表

ASP.NET 2.0數(shù)據(jù)教程之九:跨頁(yè)面的主/從報(bào)表

ASP.NET 2.0數(shù)據(jù)教程之十:使用 GridView 和DetailView實(shí)現(xiàn)的主/從報(bào)表

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

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



第三步:給DataRow添加字段級(jí)驗(yàn)證

 

字段級(jí)驗(yàn)證是指在插入或更新時(shí)檢查業(yè)務(wù)對(duì)象所涉及到的所有屬性值。拿產(chǎn)品來(lái)舉個(gè)例,某些字段級(jí)的驗(yàn)證規(guī)則如下所示:

 

·         ProductName字段不得超過(guò)40個(gè)字符

·         QuantityPerUnit字段不得超過(guò)20個(gè)字符

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

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

 

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

 

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



圖四:DataColumn提供了基本的字段級(jí)驗(yàn)證

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



圖五:在App_Code文件夾中添加新類(lèi)

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

 

ProductsDataTable.ColumnChanging.cs

系列文章導(dǎo)航:

ASP.NET 2.0數(shù)據(jù)教程之一:創(chuàng)建一個(gè)數(shù)據(jù)訪問(wèn)層

ASP.NET 2.0數(shù)據(jù)教程之二:創(chuàng)建一個(gè)業(yè)務(wù)邏輯層

ASP.NET 2.0數(shù)據(jù)教程之三:母板頁(yè)和站點(diǎn)導(dǎo)航

ASP.NET 2.0數(shù)據(jù)教程之四:使用ObjectDataSource展現(xiàn)數(shù)據(jù)

ASP.NET 2.0數(shù)據(jù)教程之五:聲明參數(shù)

ASP.NET 2.0數(shù)據(jù)教程之六:編程設(shè)置ObjectDataSource的參數(shù)值

ASP.NET 2.0數(shù)據(jù)教程之七:使用DropDownList過(guò)濾的主/從報(bào)表

ASP.NET 2.0數(shù)據(jù)教程之八:使用兩個(gè)DropDownList過(guò)濾的主/從報(bào)表

ASP.NET 2.0數(shù)據(jù)教程之九:跨頁(yè)面的主/從報(bào)表

ASP.NET 2.0數(shù)據(jù)教程之十:使用 GridView 和DetailView實(shí)現(xiàn)的主/從報(bào)表

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

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



第四步:給BLL類(lèi)添加業(yè)務(wù)規(guī)則

 

除了字段級(jí)的驗(yàn)證,可能還有一些不能在單個(gè)列中表示的包含不同實(shí)體或概念的更高級(jí)的業(yè)務(wù)規(guī)則,比如:

 

·         如果一個(gè)產(chǎn)品被標(biāo)記為“停用”,那么它的單價(jià)就不能被修改

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

·         如果某個(gè)產(chǎn)品是某供應(yīng)商唯一提供的產(chǎn)品,那么這個(gè)產(chǎn)品就不能被標(biāo)記為“停用”

 

BLL類(lèi)應(yīng)該保證始終都驗(yàn)證應(yīng)用程序的業(yè)務(wù)規(guī)則。這些驗(yàn)證可以直接的添加到應(yīng)用他們的方法中。

 

想象一下,我們的業(yè)務(wù)規(guī)則表明了如果一個(gè)產(chǎn)品是給定的供應(yīng)商的唯一產(chǎn)品,那么它就不能被標(biāo)記為“停用”。也就是說(shuō),如果產(chǎn)品X是我們從供應(yīng)商Y處購(gòu)買(mǎi)的唯一一個(gè)產(chǎn)品,那么我們就不能將X標(biāo)記為停用;然而,如果供應(yīng)商Y提供給我們的一共有3樣產(chǎn)品,分別是ABC,那么我們可以將其中任何一個(gè)或者三個(gè)全部都標(biāo)記為“停用”。挺奇怪的業(yè)務(wù)規(guī)則,是吧?但是商業(yè)上的規(guī)則通常就是跟我們平常的感覺(jué)不太一樣。

 

要在UpdateProducts方法中應(yīng)用這個(gè)業(yè)務(wù)規(guī)則,那么我們就應(yīng)該先檢查Discontinued是否被設(shè)置為true。假如是這樣的話,那么我們應(yīng)該先調(diào)用GetProductsBySupplierID來(lái)看看我們從這個(gè)供應(yīng)商處一共購(gòu)買(mǎi)了多少產(chǎn)品。如果我們僅僅從這個(gè)供應(yīng)商處購(gòu)買(mǎi)了這一個(gè)產(chǎn)品,那么我們就拋出一個(gè)ApplicationException

 

UpdateProduct

NET技術(shù)ASP.NET 2.0數(shù)據(jù)教程之二:創(chuàng)建一個(gè)業(yè)務(wù)邏輯層,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 欧美一级三级在线观看 | 91资源在线观看 | 国产在线第一页 | 日韩在线一区二区三区 | 国产精品久久久亚洲 | 精品视频一区二区三区 | 国产成人精品久久二区二区91 | 免费观看一级特黄欧美大片 | 国产欧美一区二区三区在线看 | 欧美国产激情二区三区 | 中文一区| 成人免费在线 | 亚av在线| 欧美一区二区视频 | 亚洲综合天堂网 | 欧美一区二区三区在线免费观看 | 欧美日韩中文字幕在线 | 午夜在线电影网 | 欧美精品成人一区二区三区四区 | 99精品视频网 | 操久久 | 91视频在线看 | 日日夜夜免费精品 | 国产免费一区二区 | 草草网| 欧美国产视频 | 免费视频二区 | 欧美日韩一区精品 | 国产 日韩 欧美 在线 | 日韩看片| 日韩在线不卡视频 | 老牛影视av一区二区在线观看 | 亚洲国产精品一区二区第一页 | 午夜欧美a级理论片915影院 | 欧美黄 片免费观看 | 自拍偷拍视频网 | 久久国产精品视频免费看 | 久久另类 | 国产91综合一区在线观看 | 欧美精品久久 | 亚洲欧美日韩在线一区二区 |