?
程序开发指南
(初版)
?
4.??? 表示层部分的开发
4.1概述
4.2开发
4.2.1 Web Service的使用
4.2.2画面组件的使用
1.DataGrid控件的使用
5.1概述
6.1概述
6.2开发
6.2.1继承
6.2.2调用
6.2.3单表操作的便利
6.2.4Message的使用
6.2.5Log的使用
6.2.5异常处理
7.共同部分
1.?? 概要
此文档为开发用文档,希望开发人员通过本文档能够熟悉整个项目的Framework,并且能够在Framework上进行规范,高效的开发。
?
2.??? 系统物理结构图
?
3.??? 系统架构图
?
4.?? 表示层部分的开发
4.1概述
表示层主要由Windows Form组成,复杂部分在于有DataGrid的画面,处理起来相对要繁琐一些。下图是表示层的目录结构图。
下图是表示层的类图。
?
4.2开发
4.2.1 Web Service的使用
引用的Web Service有
名称
chuou.service.login;
chuou.service.initial;
chuou.service.masuta
chuou.service.hattyuu
URL
http://localhost/CHUOU_Service/src/chuou/service/init/InitialService.asmx;
http://localhost/CHUOU_Service/src/chuou/service/login/LoginService.asmx;
http://localhost/CHUOU_Service/src/chuou/service/masuta/MasutaService.asmx
http://localhost/CHUOU_Service/src/chuou/service/masuta/HattyuuService.asmx
?
(注意 前两个WebService不可以手工更新)
程序例子如下
private MasutaService masutaService = null;
……
private void form_2_17_Load(object sender, System.EventArgs e)
{
……
masutaService=MainFrame.masutaService;
……
|
private void btnKensaku_Click(object sender, System.EventArgs e)
{??????
……
DataSet ds=masutaService.doSearch_form2_17(null);??????????????????
……
}
4.2.2画面组件的使用
1.DataGrid控件的使用
所有画面中的DataGrid使用chuou.common.view.component.SuperGrid组件。
程序例子如下
private SuperGrid extendedDataGrid1;
this.extendedDataGrid1 = new SuperGrid();
2文本框控件的使用
所有画面中的文本框(包括自定义控件里面)使用chuou.common.view.component. SuperTextBox组件。
程序例子如下
private SuperTextBox txtModelName;
this.txtModelName = new SuperTextBox(Mask.Digit);
//类型控制
?public enum Mask
{
??????? None,//不做任何处理
??????? DateOnly,//日期型
??????? Decimal,//数值型
??????? Digit//数字型
};
//IME输入法控制
public enum ImeMask
{
??????? None, //不做任何处理
??????? Off, //IME关闭
??????? On//IME打开????
}
//执行回车键的操作
public delegate void enterKeyDown();
4.2.3画面中显示Message的使用。
?? 考虑到程序开发的便利和修改的方便,使用chuou.common.view.message.AppMessage类。
程序例子如下
AppMessage.Show(this,"E1001");
"E1001"为Message的编号。
4.2.4画面中Log的使用
?? 为了方便以后的调试,每个方法,关键的处理都要求写log。
程序例子如下
using chuou.common.log;
……
ILog log=ClientLog.getInstance().GetLogger(typeof(Form_2_2));
……
log.Info("step into the Form2_Load");
log的输出位置默认为 c:\ chuou.log
4.2.5画面中状态的保存
?? 考虑到开发上的便利性,画面中的状态保存在文件中,处理流程为先定义一个对象,把画面中要保存的数据放到对象中去,然后将此对象序列化到文件中去,到了要读取画面状态的时候,再从此文件中反序列化出对象来,具体实现由chuou.common.util.ObjectSave类来实现。
程序例子如下
第一步,先定义一个对象类。
using System;
using System.Runtime.Serialization;
namespace chuou.view.hattyuu.view.save
{
??????? [Serializable]
??????? public class Form_3_2_1Save
??????? {
??????? public Form_3_2_1Save(){??????? }
??????? private bool _chkZenka;
??????? private bool _chkSetsu1;
??????? private bool _chkSetsu2;
??????? public bool chkZenka
??????? {
??????????????? get { return this._chkZenka; }
??????????????? set { this._chkZenka = value; }
??????? }
??????? public bool chkSetsu1
??????? {
??????????????? get { return this._chkSetsu1; }
??????????????? set { this._chkSetsu1 = value; }
??????? }
??????? public bool chkSetsu2
??????? {
??????????????? get { return this._chkSetsu2; }
??????????????? set { this._chkSetsu2 = value; }
??????? }}
注意? 必须要添加Serializable属性。
第二步,写对象到文件中。
Form_3_2_1Save save=new Form_3_2_1Save();
save.chkSetsu1=chkSetsu1.Checked;??????????????
save.chkZenka=chkZenka.Checked;
ObjectSave.putObject(this.GetType(),save);?????????????
this.Close();??
第三步,读文件到对象中。
Form_3_2_1Save obj= ObjectSave.getObject(this.GetType()) as Form_3_2_1Save;???????????? if(obj!=null){
??????????????? chkZenka.Checked=obj.chkZenka;
??????????????? chkSetsu1.Checked=obj.chkSetsu1;??????????????????????????????????????? }
4.2.6画面之间数据的传送
??????? 开发时候,涉及到画面之间传送数据的时候,都要按照此规范来调用。
开发共分三步
第一步,先要定义一个本画面需要接受的数据模型,命名空间为
namespace chuou.view.*.view.trans,名称为Form_*_*Trans.cs,参考如下
namespace chuou.view.hattyuu.view.trans
{
public class Form_3_2_12Trans :ITrans{
??????? public Form_3_2_12Trans(string strOldSaiBan) {
??????????????? _strOldSaiBan=strOldSaiBan; }
??????? private string _strOldSaiBan;
??????? public string StrOldSaiBan{
??????????????? get {return _strOldSaiBan;} }
??????? public bool check(){
??????????????? if(StrOldSaiBan==null || StrOldSaiBan.Trim().Length==0){
??????????????????????? return false; }
??????????????????????? return true; }} }
注意? 必须实现Itrans接口。
第二步,存放数据,参考如下
private void btnSeibanIkkatsuHenkou_Click(object sender, System.EventArgs e)
{
??????? Form_3_2_12Trans trans=new Form_3_2_12Trans("test");
??????? ObjectTrans.putTransObject(typeof(Form_3_2_12),trans);
??????? Form_3_2_12 form = new Form_3_2_12();
??????? form.Show();
}
第三步,读取数据,参考如下
private void form_3_2_12_Load(object sender, System.EventArgs e)
{
Form_3_2_12Trans trans= ObjectTrans.getTransObject(typeof(Form_3_2_12)) as Form_3_2_12Trans;
??????????????? Console.WriteLine("trans value="+trans.StrOldSaiBan);
}
Business层部分的开发
5.1概述
这层主要是写 *Service.asmx.cs文件,按照模块分成不同的Web Service,比如有MasutaService.asmx,HattyuuService.asmx等等。
LoginService.asmx是专门用来处理用户登入的,开发中,不准手工进行更新,如有更新,我会通知大家从CVS上更新。initialService.asmx是Framework用的,也是不准手工更新。
5.2开发
现有的Web Service如下图。
目录图如下
工程图如下
注意点
1,考虑到开发上的便利和管理上的便利,规定每个画面,每次操作,比如初始化,检索,更新操作,都在相应的模块的WebService中加方法,命名规则为
doInit_form*_*,doSearch_form*_*,doUpdate_form*_*。
2,原则上WebService文件中不写具体的业务逻辑,而是写在后台Business层的某个类里面,这样做是为了开发人员方便自己进行写测试代码测试后台的业务逻辑。
3,一些masuta表直接放在Application域里面,如下Application[Constant.APPLICATION_KEY_DATA] =ds;
开发是使用方法为
DataTable dtDptcd=ds.Tables[0];
DataTable dtSyain=ds.Tables[1];
DataRow rowDptcd=MstHelp.searchTableByPK(dtDptcd,dptId);
DataRow rowSyain=MstHelp.searchTableByPK(dtSyain,id);
6.Dao层的开发
6.1概述
?? 所有的业务逻辑都写在这层,类的位置为????
chuou.service.*.process.Business_*_*.cs
? 原则上每个画面对应一个类,共同的部分放在chuou.service.common目录下。
类图如下
6.2开发
??6.2.1继承
? 每个business类都要继承SuperDao类,SuperDao实现了getConnection,closeConnection,updateExecute,queryExecute等一系列方法,这样开发上就只要专注于业务逻辑,不用考虑.NET中的ADO.NET了。
类图如下
6.2.2调用
得到数据库连接为调用getConnection(),关闭数据库连接为调用closeConnection(OracleConnection conn),查询表为调用queryExecute(),更新表为调用updateExecute()。
6.2.3单表操作的便利
考虑到开发的便利,如果是进行单表的查询,更新,插入,删除,可以直接调用Dao的开发包。
类图如下
程序例子如下
IDao dao=DaoFactory.CreateDao(new DaoConfig(DatabaseType.ORACLE,Help.CONN_STR));
dao.Open();
LoginmanageModel model=new LoginmanageModel();
model.字段1 =new NString(id);
model.字段2 = new NString(dptId);??????????????????????
model.字段3??=new NDateTime(System.DateTime.Now);
dao.Insert(model);
dao.Close();
6.2.4Message的使用
程序例子如下
Message.getMessage("S1001"));
6.2.5 Log的使用
程序例子如下
using chuou.common.log;
……
private ILog log = ServerLog.getInstance().GetLogger(typeof (Business_3_2_1));
……
log.Info("step into the doSearch");
log.Error("Error in queryExecute() method",e);
log的输出位置默认为 c:\ chuou_server.log
6.2.5异常处理
? Dao层程序统一抛出DaoException异常,Business层统一抛出BusinessException异常。
类图如下
?
8. 程序测试
为了保证开发的质量,原则上对于后台的业务逻辑部分都需要写测试代码,使用Nunit工具来进行测试。
工程类图如下
Nunit工具的使用如下
代码示范如下
[TestFixture]
public class TestDao{
private const string conn = "User Id=chuou;Password=chuou;Data Source=order;";
public TestDao(){?????? }
[Test]
public void testSelect()??????????????? {
IDao dao = DaoFactory.CreateDao(new DaoConfig(DatabaseType.ORACLE, conn));
dao.Open();
Test2Model model = new Test2Model();
model.Username = new NString("luohao");
Console.WriteLine(dao.FindRecords(model).Count);
dao.Close();}
[Test]
public void testInsert(){
IDao dao = DaoFactory.CreateDao(new DaoConfig(DatabaseType.ORACLE, conn));
dao.Open();
Test2Model model = new Test2Model();
model.Userid = new NString(DateTime.Now.ToString());
model.Username = new NString("luohao");
model.Date1 = new NDateTime(DateTime.Now);
model.Float1 = new NDecimal(new decimal(517.12f));
model.Number1 = new NDecimal(12345);
Console.WriteLine(dao.Insert(model));
dao.Close();}
?
[TestFixture]
public class TestBusiness_2_17
{
ILog log = ServerLog.getInstance().GetLogger(typeof (TestBusiness_2_17));
public TestBusiness_2_17()
{
}
[Test]
public void testDoSearch()
{
??????? DataSet result1=new Business_2_17().doSearch(null);
??????? Assert.IsNotNull(result1);
??????? DataSet result2=new Business_2_17().doSearch("000101");
??????? Assert.IsNotNull(result2);
}
}
9.工程结构
说明如下
? chuou_app为画面的工程,chuou_service为Business层和Dao层的工程,chuou_test为测试工程,commonLib为公用的库,ModelGenerator为自动生成Model的工具。
?
?
本文地址:http://com.8s8s.com/it/it44296.htm