首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

关于三层结构的疑惑,该怎么处理

2012-01-19 
关于三层结构的疑惑为了学习三层结构的用法,在做一个学校班级管理的系统遇到的一些问题。我是这样设计的这

关于三层结构的疑惑
为了学习三层结构的用法,在做一个学校班级管理的系统遇到的一些问题。
我是这样设计的

这是第一个类Student,记录学生信息
using   System;
namespace   Demo
{
public   class   Student
{
private   int   _id;
private   string   _name;
private   int   _age;

public   int   ID
{
get{   return   _id;   }
set{   _id   =   value;   }
}

public   string   Name
{
get{   return   _name;   }
set   {   _name   =   value;   }
}

public   int   Age
{
get{   return   _age;   }
set{   _age   =   value;   }
}

public   Student(   string   name,   int   age   )
{
Name   =   name;
Age   =   age;
}
}
}

这是第二个类Class,记录班级信息
using   System;

namespace   Demo
{
public   class   Class
{
private   Data   _data;
private   int   _id;
private   string   _name;
private   System.Collections.ArrayList   _students;

public   int   ID
{
get{   return   _id;   }
set{   _id   =   value;   }
}

public   string   Name
{
get{   return   _name;   }
set   {   _name   =   value;   }
}

public   int   StudentCount
{
get{   return   _students.Count;   }
}

public   System.Collections.ArrayList   Students
{
get{   return   _students;   }
}

public   Class(   string   name,   int   age   )
{
_data   =   new   Data();
_students   =   new   System.Collections.ArrayList();
Name   =   name;
}

public   void   Add(   Student   student   )
{
Students.Add(   student   );
}

public   void   Save()
{
for(   int   i=0;i <   Students.Count;   i++   )
{
Student   student   =   (Student)Students[i];
_data.Save(   ID,   Name,   student.ID,   student.Name,   student.Age   );
}
}
}
}

这是第三个类Data,负责对数据库操作
using   System;

namespace   Demo
{
public   class   Data
{
public   Data()
{

}

///   <summary>
///   向数据库写入数据
///   </summary>
public   void   Save(   int   classID,   string   className,   int   studentID,   string   studentName,   int   studentAge   )
{

}
}
}


我是打算这样做应用,主程序只负责人机界面的交互,主程序中的DATAGRID与一个
DataTable绑定,DataTable与一个Class类对应,类Student和Class负责数据逻辑,类Data负责与数据库的读写。
疑惑一:这样做的初衷不想让主程序中与数据库产生关系,但是取DataTable列的时候又要涉及到列名,这样又要用到数据库表的列名,这样就矛盾了。
疑惑二:当界面上DataGrid中每一个单元格的内容改变时,需要马上更新类Student的实例,由这个实例来做一些逻辑判断,这样显得非常麻烦。
疑惑三:一个窗口所占内存中有了一个DataTable和一个Class,那么同样的信息消耗的内存是两倍。
如何解决以上三个问题呢。

[解决办法]
1)维护一个数据库操作类,操作类封装了一种表结构,这样通过一种映射的机制脱离底层的直接的数据库操作。
2)给Student类添加一个事件,当内容格改变的时候,把改变的内容送到Student类,由Student类维护这个改变。


3)如果不是BS模式,CS带来的内存消耗很小,如果你愿意,可以做成工厂模式(单例模式)

[解决办法]
疑惑一:这样做的初衷不想让主程序中与数据库产生关系,但是取DataTable列的时候又要涉及到列名,这样又要用到数据库表的列名,这样就矛盾了。

与数据库之间的访问应该有 Data类完全隔离。也就是说当你改用DataTable的时候应该是
在Data类中提供方法,返回一个DataTable。
这样对象与数据列的关系全部由Data类管理。

疑惑二:当界面上DataGrid中每一个单元格的内容改变时,需要马上更新类Student的实例,由这个实例来做一些逻辑判断,这样显得非常麻烦。

其实这里有两种情况,第一当你Studuent已经改变,就马上更新数据库。或信息改变保存在一个对象列表中,当确认改后在commit到数据库。其中注意是你使用DataTable绑定DataGrid,还是使用对象列表。无论那一个,我认为在Student加一个isChange属性,用于在Data中更新如
public void Save(Student s)
{
if(s.ischange)
{
数据库操作
}
}
public void Save(List s)
{
foreach(Student ss in s)
Save(ss);
}
DataTable也是一样,不过需要把DataRow转换为Student

疑惑三:一个窗口所占内存中有了一个DataTable和一个Class,那么同样的信息消耗的内存是两倍。
一个DataSet可以由两个DataTable,一个存放Class信息,一个存放Class信息,在绑定的时候,通过 DataView或者Relation对象进行关联绑定,这样就可以。不知道是否是你需要的答案

另外,我认为使用使用了对象,在Data中尽量使用对象,因为如果有数据结构修改的话,方法的参数可以不改。

建议使用NHibernate,我个人觉得对于oo来说很方便。


[解决办法]
lz用的应该是Winform吧。
给个建议,如果需要处理业务逻辑,用实体类和泛型会方便很多,比如DataGridView绑定到List <Student> 。最好对反射有点了解。
如果纯粹处理数据,比如报表等,用DataTable。

热点排行