Ctamor

个体和迭代,超越过程和工具;工作的软件,超越完整的文档;客户协作,超越合同谈判;响应变更,超越履行计划;

导航

利用.Net框架开发应用系统 (3)

Posted on 2006-12-03 14:27  Ctamor (四川理工)  阅读(122)  评论(0编辑  收藏  举报
业务逻辑的处理


有了上面的基础,我们很容易将这些类进行组合,构建我们的业务处理功能。在这个系统中,涉及到复杂业务处理的部分只有入库单入库这个功能,这个功能我们封装在Wharehouse类中,其过程可以用序列图表示如下:



相应的程序代码和注解如下,在这里,我们使用了事务处理,因此,Wharehouse类继承了System.EnterpriseServices.ServicedComponent:
 1//设置事务处理类型
 2    [Transaction(TransactionOption.Required)]
 3//继承ServicedComponent,以支持使用Windows的Transaction Service
 4    public class Wharehouse : System.EnterpriseServices.ServicedComponent 
 5    {
 6        public Wharehouse(){}
 7        //入库的业务逻辑代码
 8        public void StoreIntoWarehouse(EntityData IndepotForm)
 9        {
10            //得到入库单明细
11DataTable tbl=IndepotForm.Tables["InDepotFormDetail"];
12            try
13            {
14            //对于入库单明细中的每个产品,都要修改原有产品的库存数量
15ProductEntityDAO ped=new ProductEntityDAO();
16                for(int i=0;i<tbl.Rows.Count;i++)
17                {
18                    //得到入库单明细的一个产品信息
19DataRow formdetail=tbl.Rows[i];
20string productID=formdetail["ProductID"].ToString();
21decimal inCount=(decimal)formdetail["InCount"];
22        //找到需要修改库存数量的产品
23EntityData product=ped.FindByPrimaryKey(productID);
24DataRow productRow=product.GetRecord("Product");
25            //修改产品库存数量
26productRow["CurrentCount"]=(decimal)productRow["CurrentCount"]+inCount;
27        ped.UpdateEntity(product);
28            }

29            ped.Dispose();
30            //保存入库单
31    InDepotFormEntityDAO inDepotForm=new InDepotFormEntityDAO();
32            inDepotForm.InsertEntity(IndepotForm);
33            IndepotForm.Dispose();
34            //如果成功,结束事务
35            ContextUtil.SetComplete();
36            }

37            catch(Exception ee)
38            {
39                //否则,回滚事务
40ContextUtil.SetAbort();
41                throw ee;
42            }

43        }

44    }



业务服务的提供


现在,整个系统的功能部分已经完成了,我们需要将这些功能组装成系统的各个模块,以便客户端的调用。

在前面的开发过程中,我们实际上还没有对系统进行明确的功能模块划分,在这里,我们才开始所谓的模块划分。在所有客户端对系统的调用中,基本上都是调用这个部分的功能,而不会直接调用前面几个部分的内容,这样使系统达到良好的封装性。

这是一个很好的软件开发的方式。采用这种做法,我们可以将前面的内容封装成一个个的组件,在这里,可以根据需要很方便的利用前面的组件进行功能的重新组合,也方便系统的修改和升级,为软件开发的组件化奠定基础。

在本系统中,业务服务位于BusinessFacade目录,在这里,我们将系统分成两个模块:产品资料的维护和仓库事务管理,模块功能调用接口分别封装在ProductManagement和WharehouseManagement类中。这两个类的代码很简单,主要是封装前面几层内容的功能。例如,WharehouseManagement类封装了入库的操作供客户端掉用,他的代码一目了然,如下:



WEB层的设计


1、 WEB层的主要功能是同客户交户,这一层向用户提供服务,主要功能是提供HTML界面,接受用户的输入,调用业务功能等,完成用户的需求。在这个层次里面没有业务逻辑的处理,而只是调用业务层面提供的服务。下面看看一个入库操作的例子。



在这个层次中,我们没有将表单直接写在ASP.Net页面中,而是先把功能写成Web控件,然后再在ASP.Net页面中引用这些控件。这样做的目的,主要是为了将来的重用性考虑。