关于三层结构的疑惑
为了学习三层结构的用法,在做一个学校班级管理的系统遇到的一些问题。
我是这样设计的
这是第一个类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。