对应类的实例化,程序员再熟悉不过了,我虽然刚进入IT行业不久,也见得不陌生,但有些问题确总不能理解清楚。
比如有两个类,一个为静态类(简称A),另一个(简称B)的实例对应着数据库的记录。当A中有一个方法为GetB(Bid)即通过B实例的ID实例化B,
Bid对应的是数据库中的记录。这种情况,B实例的实例化便有几种方式了:
第一种方式:
public static B GetB(int bid)
{
B b = new B();
查询数据库;
将需要用到的B的属性进行赋值,部分属性不赋值;
return B;
}第二种方式:
public static B GetB(int bid)
{
B b = new B();
查询数据库;
将B的每一个属性进行赋值;
return B;
}
第三种方式:
public static B GetB(int bid)
{
对应需要用到的B的属性定义变量;
查询数据库;
将变量进行赋值;
B b = new B(上面定义的变量);//对属性进行赋值的工作都又B类完成,B类定义不同参数构造函数
return B;
}
第四种方式:
public static B GetB(int bid)
{
对应B的所有属性定义变量;
查询数据库;
将变量进行赋值;
B b = new B(上面定义的变量);//对每个属性进行赋值的工作都又B类完成,B类定义全属性参数构造函数
return B;
}第五种方式:
public static B GetB(int bid)
{
B b = new B(bid);//查询数据库,或许记录,对每个字段进行赋值的工作都又B类完成,B类定义功能齐全的构造函数
return B;
}
我们现在正在开发的薪酬辅助核算系统,经过讨论采用了第4中方式对类进行实例化,但由于系统中类关系的复杂性,造成了造成了A类中GetB方法设计比较复杂,所以我有点怀疑第四种方式初始化类是否有效、可行,个人比较偏向第五种。
下面是我们系统相关的几个类图:


其中,我们为每个类定义了数据层的数据操作类(业务层类名后加DAL),BusinessConsignController便是上文说到的A类,PayList便是B类,GetB()对应的是GetPayList。
我使用第四种方式实现的代码如下:
1
/// <summary>
2
/// 通过PayListID获取对应的PayList
3
/// </summary>
4
/// <param name="plid">要获取的PayList的id号</param>
5
public static PayList GetPayList(int plid)
6
{
7
Database db = DatabaseFactory.CreateDatabase("SqlServerExternal");
8
string sqlCommand = "GetPayList";
9
DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand);
10
db.AddInParameter(dbCommand, "PayListId", DbType.Int32, plid);
11
12
DataSet dataSet = db.ExecuteDataSet(dbCommand); //通过存储过程获取的三个DataTable
13
DataTable plDataTable = dataSet.Tables[0]; //包含了对应PayList的信息,只有一条记录
14
DataTable pepiDataTable = dataSet.Tables[1]; //包含了对应PayList的所有PayEntry和PayItem信息,PayEntry重复
15
DataTable plcDataTable = dataSet.Tables[2]; //包含了对应PayList的合并信息
16
17
if (plDataTable.Rows.Count != 1)
18
return null;
19
PayList pl = new PayList(); //初始化PayList
20
pl.plname = plDataTable.Rows[0]["name"].ToString(); //为PayList的每个属性进行赋值
21
pl.createDateTime = (DateTime)plDataTable.Rows[0]["CreateDateTime"];
22
pl.payDateTime = (DateTime)plDataTable.Rows[0]["PayDateTime"];
23
pl.owner = OrganizationController.GetPerson((int)plDataTable.Rows[0]["ownerId"]);
24
pl.payTemplate = PayTypeController.GetPayTemplate((int)plDataTable.Rows[0]["PayTemplateId"]);
25
pl.state = (PayListState)plDataTable.Rows[0]["state"];
26
27
PayEntry pe;
28
29
PayItem pi;
30
31
int rowNum = 0;
32
while (rowNum < pepiDataTable.Rows.Count) //此循环为了构造PayList的payEntries属性
33
{
34
pe = new PayEntry(); //初始化PayEntry
35
pe.personal = OrganizationController.GetPerson((int)pepiDataTable.Rows[rowNum]["PersonalId"]);//为PayEntry的每个属性进行赋值
36
pe.peid = (int)pepiDataTable.Rows[rowNum]["PayEntry.ID"];
37
do //此循环为了构造PayEntry的payItems属性
38
{
39
pi = new PayItem(); //初始化PayItem
40
pi.financedept = (Department)pepiDataTable.Rows[rowNum]["FinanceDeptId"]; //为PayItem的所有属性赋值
41
pi.piid = (int)pepiDataTable.Rows[rowNum]["id"];
42
pi.money = (decimal)pepiDataTable.Rows[rowNum]["money"];
43
pi.project = (Project)pepiDataTable.Rows[rowNum]["projectId"];
44
pi.payItemTemplate = payTemplate.PayItemTemplates[(int)pepiDataTable.Rows[rowNum]["PayItemTemplateId"]];
45
pi.RemarkInfo = pepiDataTable.Rows[rowNum]["RemarkInfo"].ToString();
46
pi.ResponseInfo = (decimal)pepiDataTable.Rows[rowNum]["ResponseInfo"];
47
48
pi.payItems.Add(pi.Id,pi); //将新的PayItem赋予PayEntry属性payItems
49
rowNum ++;
50
}
51
while (rowNum < pepiDataTable.Rows.Count && peid == (int)pepiDataTable.Rows[rowNum]["PayEntry.ID"]);
52
pl.payEntries.Add(pe.Id, pe); //将新的PayEntry赋予PayList属性payEntrys
53
}
54
55
PayListCombine payListCombine;
56
57
for (rowNum = 0; rowNum < plcDataTable.Rows.Count; rowNum++) //此循环为了构造PayList的payListCombines属性
58
{
59
plc = new PayListCombine();
60
plc.sourcePayListId = (int)plcDataTable.Rows[rowNum]["SourcePayListId"];
61
plc.sourcePayItemTemplateId = (int)plcDataTable.Rows[rowNum]["SourcePayItemTemplateId"];
62
plc.targetPayListId = (int)plcDataTable.Rows[rowNum]["TargetPayListId"];
63
plc.targetPayItemTemplateId = (int)plcDataTable.Rows[rowNum]["TargetPayItemTemplateId"];
64
plc.Id = (int)plcDataTable.Rows[rowNum]["Id"];
65
pl.payListCombines.Add(plc.Id, plc); //将新的payListCombine赋予PayList属性payListCombines
66
}
67
return pl;
68
}
/// <summary>2
/// 通过PayListID获取对应的PayList3
/// </summary>4
/// <param name="plid">要获取的PayList的id号</param>5
public static PayList GetPayList(int plid)6
{7
Database db = DatabaseFactory.CreateDatabase("SqlServerExternal");8
string sqlCommand = "GetPayList";9
DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand);10
db.AddInParameter(dbCommand, "PayListId", DbType.Int32, plid);11
12
DataSet dataSet = db.ExecuteDataSet(dbCommand); //通过存储过程获取的三个DataTable13
DataTable plDataTable = dataSet.Tables[0]; //包含了对应PayList的信息,只有一条记录14
DataTable pepiDataTable = dataSet.Tables[1]; //包含了对应PayList的所有PayEntry和PayItem信息,PayEntry重复15
DataTable plcDataTable = dataSet.Tables[2]; //包含了对应PayList的合并信息16

17
if (plDataTable.Rows.Count != 1)18
return null;19
PayList pl = new PayList(); //初始化PayList20
pl.plname = plDataTable.Rows[0]["name"].ToString(); //为PayList的每个属性进行赋值21
pl.createDateTime = (DateTime)plDataTable.Rows[0]["CreateDateTime"];22
pl.payDateTime = (DateTime)plDataTable.Rows[0]["PayDateTime"];23
pl.owner = OrganizationController.GetPerson((int)plDataTable.Rows[0]["ownerId"]);24
pl.payTemplate = PayTypeController.GetPayTemplate((int)plDataTable.Rows[0]["PayTemplateId"]);25
pl.state = (PayListState)plDataTable.Rows[0]["state"];26
27
PayEntry pe;28

29
PayItem pi;30

31
int rowNum = 0;32
while (rowNum < pepiDataTable.Rows.Count) //此循环为了构造PayList的payEntries属性33
{34
pe = new PayEntry(); //初始化PayEntry35
pe.personal = OrganizationController.GetPerson((int)pepiDataTable.Rows[rowNum]["PersonalId"]);//为PayEntry的每个属性进行赋值36
pe.peid = (int)pepiDataTable.Rows[rowNum]["PayEntry.ID"];37
do //此循环为了构造PayEntry的payItems属性38
{39
pi = new PayItem(); //初始化PayItem40
pi.financedept = (Department)pepiDataTable.Rows[rowNum]["FinanceDeptId"]; //为PayItem的所有属性赋值41
pi.piid = (int)pepiDataTable.Rows[rowNum]["id"];42
pi.money = (decimal)pepiDataTable.Rows[rowNum]["money"];43
pi.project = (Project)pepiDataTable.Rows[rowNum]["projectId"];44
pi.payItemTemplate = payTemplate.PayItemTemplates[(int)pepiDataTable.Rows[rowNum]["PayItemTemplateId"]];45
pi.RemarkInfo = pepiDataTable.Rows[rowNum]["RemarkInfo"].ToString();46
pi.ResponseInfo = (decimal)pepiDataTable.Rows[rowNum]["ResponseInfo"];47

48
pi.payItems.Add(pi.Id,pi); //将新的PayItem赋予PayEntry属性payItems49
rowNum ++;50
}51
while (rowNum < pepiDataTable.Rows.Count && peid == (int)pepiDataTable.Rows[rowNum]["PayEntry.ID"]);52
pl.payEntries.Add(pe.Id, pe); //将新的PayEntry赋予PayList属性payEntrys53
}54

55
PayListCombine payListCombine;56

57
for (rowNum = 0; rowNum < plcDataTable.Rows.Count; rowNum++) //此循环为了构造PayList的payListCombines属性58
{59
plc = new PayListCombine();60
plc.sourcePayListId = (int)plcDataTable.Rows[rowNum]["SourcePayListId"];61
plc.sourcePayItemTemplateId = (int)plcDataTable.Rows[rowNum]["SourcePayItemTemplateId"];62
plc.targetPayListId = (int)plcDataTable.Rows[rowNum]["TargetPayListId"];63
plc.targetPayItemTemplateId = (int)plcDataTable.Rows[rowNum]["TargetPayItemTemplateId"];64
plc.Id = (int)plcDataTable.Rows[rowNum]["Id"];65
pl.payListCombines.Add(plc.Id, plc); //将新的payListCombine赋予PayList属性payListCombines66
}67
return pl;68
}


浙公网安备 33010602011771号