stand on the shoulders of giants

【ASP.NET step by step】之二 Create a BLL

上一篇写的有些杂乱,有点事无巨细的感觉。这篇还是简洁为主。

1. BLL将TableAdapter里面的方法进一步包装,例如 ProductsBLL.GetProducts(),
    另外各个方法应该有必要的逻辑,比如不同的人有不同的权限,返回的产品列表应该不一样,等等。。。

2. .NET 2.0增加了nullable types,在函数的参数列为 int?x 的形式,表示x可以为空

3. AddProduct方法的特殊之处。
A:
因为ProductsRow是继承于ADO.NETDataRow,而DataRow没有默认的无参构造函数,为了创建一个ProductsRow的实例,我们必须先创建一个ProductsDataTable的实例,然后调用它的NewProductRow方法
 public bool AddProduct(string productName, int? supplierID, int? categoryID, string quantityPerUnit, 
 52                          decimal? unitPrice, short? unitsInStock, short? unitsOnOrder, short? reorderLevel, 
 53                          bool discontinued)
 54    {
 55        // 新建一个ProductRow实例
 56        Northwind.ProductsDataTable products = new Northwind.ProductsDataTable();
 57        Northwind.ProductsRow product = products.NewProductsRow();
 58
 59        product.ProductName = productName;
 60        if (supplierID == null) product.SetSupplierIDNull(); else product.SupplierID = supplierID.Value;
B:
由于Visual Studio给我们创建的Strong-typed DataTable并不使用Nullable types,所以,遇到可以是空的参数,要使用SetColumnNameNull()的方法:
if (supplierID == null
   product.SetSupplierIDNull(); 
else 
   product.SupplierID 
= supplierID.Value;

4. 原来的绑定是这样做的:
1 ProductsTableAdapter productsAdapter = new ProductsTableAdapter();
2 GridView1.DataSource = productsAdapter.GetProducts();
3 GridView1.DataBind();
现在呢;
1 ProductsBLL productLogic = new ProductsBLL();
2 GridView1.DataSource = productLogic.GetProducts();
3 GridView1.DataBind();

5.  productLogic.UpdateProduct("Scott's Tea", 1, 1, null, -14m, 10, null, null, false, 1); 更新ProductID为1的产品信息。
  try
 // 这个操作将会失败,因为我们试图使用一个小于0的UnitPrice
      productLogic.UpdateProduct("Scott's Tea"11null-14m, 10nullnullfalse1);}
 catch (ArgumentException ae) { Response.Write("There was a problem: " + ae.Message); }
    一般的验证可以通过dataset设计器来设置,如果验证UnitPrice不能小于零呢,或者其他特殊的要求。
   看一看我们添加了一个新的字段级的验证,注意这种使用Partial类来扩展TableAdapter中的方法(重写BeginInit(),添加EventHandler),
   使得DAL和BLL不清晰

ProductsDataTable.ColumnChanging.cs

 

   进入UpdateProduct方法: 
  //....
  product.ProductName = productName;
  if (supplierID == null) product.SetSupplierIDNull(); else product.SupplierID = supplierID.Value; 
  //...
   第一步,设置第一个参数,ProductName,程序进入NorthWind类的嵌入类ProductRow的ProductName这个property的set部分
set {      this[this.tableProducts.ProductNameColumn] = value;   }  //value="Scott's Tea"
   第二步,因为更改了column,产生ColumnChanging事件,触发ValidateColumn函数响应,进入ValidateColumn函数内部。
   UpdateProduct其他的参数依照依次处理。 直到遇到设置unitprice = -14,
  throw new ArgumentException("UnitPrice cannot be less than zero""UnitPrice");
   进入Catch{}, response.wirte()会将异常显示在页面开头部分。
   There was a problem: UnitPrice cannot be less than zero Parameter name: UnitPrice









posted @ 2008-11-30 14:36  DylanWind  阅读(271)  评论(0编辑  收藏  举报