M
Mark Lai
Unregistered / Unconfirmed
GUEST, unregistred user!
各位大虾:
想向大家请教一下三层架构的方法问题,我这方面的经验比较少,希望能得到大家的帮助.
在三层的架构中,如果希望能在中间层完全做面向对象来做.比如说,一个学生选课的系统,以下的想法不知道是否正确:
设计一个学生接口IStudent,它封装了学生的一些信息,如学生ID,学生名,班级等;
设计一个课程接口ICourse,封装了课程的一些信息,如课程ID,课程名,学分等;
按照面向对象的想法,客户端似乎应该只与IStudent和ICourse交互,即取得一个实现了IStudent接口的COM+对象,或取得一个ICourse的对象,再调用它们的方法.比如学生选择某个课程和话,可以使用类似IStudent.SelectCourse(sCourse : ICourse)的代码.
但是这其中有不少的问题.
1、要新建学生或课程的话,应该怎么做?我想过两种可能的做法:
第一种是实现一个封装了数据库的COM+对象IMYDB,在IMYDB中定义一个方法
IMYDB.CreateStudent(sName,sClass: WideString):IStudent;
或IMYDB.SaveStudent(out sStudent:IStudent);
这两种方法不同点在于,CreateStudent是希望通过传递一些初始化信息(sName,sClass)给IMYDB,面由IMYDB将这些信息保存到DB后,生成一个包括这些信息的Student对象.
而SaveStudent方法则是希望在客户端先建立好Student的对象,并将它传递给IMYDB,让IMYDB根据这个对象的信息去保存到DB.
这里面还有小一个问题,就是ID的问题,因为ID是一个主键,所以应该是不能修改的,也就是只读的,但是无论上面的那一种方法,都需要在建立这个Student对象并保存后设定一个ID,那么之个ID属性似乎又不能是只读的.这个问题我一直都觉得很困惑,也许上述的想法本身就不对呢?
2、Student对象到底应该在哪里创建?如果用上面的CreateStudent的话,很明显是在IMYDB中创建并返回,而用SaveStudent的话刚应该是在客户端创建。那么如果希望取得一个已存在DB中的的学生或课程对象时,应该怎么做呢?似乎应该使用类似
IMYDB.GetStudent(sId:Integer):IStudent;
或IMYDB.GetStudent(in sId:Integer;out sStudent: IStudent);
来取得这个对象.但是在Type Library编辑器中,无法定义上面的两个方法.似乎是COM+对象只能返回HRESULT,而想定义GetStuent(in sId:Integer;out sStudent: IStudent);这种方法也不成功,即使将sStudent定义成IUnknow * 也提示OUT参数应该是一个指针.
以上的这些问题让我觉得很困惑,是不是最初的想法就已经不对了呢?通常的三层应该一般地设计思路是怎样的呢?希望各位高手能不吝赐教!不胜感激!!
想向大家请教一下三层架构的方法问题,我这方面的经验比较少,希望能得到大家的帮助.
在三层的架构中,如果希望能在中间层完全做面向对象来做.比如说,一个学生选课的系统,以下的想法不知道是否正确:
设计一个学生接口IStudent,它封装了学生的一些信息,如学生ID,学生名,班级等;
设计一个课程接口ICourse,封装了课程的一些信息,如课程ID,课程名,学分等;
按照面向对象的想法,客户端似乎应该只与IStudent和ICourse交互,即取得一个实现了IStudent接口的COM+对象,或取得一个ICourse的对象,再调用它们的方法.比如学生选择某个课程和话,可以使用类似IStudent.SelectCourse(sCourse : ICourse)的代码.
但是这其中有不少的问题.
1、要新建学生或课程的话,应该怎么做?我想过两种可能的做法:
第一种是实现一个封装了数据库的COM+对象IMYDB,在IMYDB中定义一个方法
IMYDB.CreateStudent(sName,sClass: WideString):IStudent;
或IMYDB.SaveStudent(out sStudent:IStudent);
这两种方法不同点在于,CreateStudent是希望通过传递一些初始化信息(sName,sClass)给IMYDB,面由IMYDB将这些信息保存到DB后,生成一个包括这些信息的Student对象.
而SaveStudent方法则是希望在客户端先建立好Student的对象,并将它传递给IMYDB,让IMYDB根据这个对象的信息去保存到DB.
这里面还有小一个问题,就是ID的问题,因为ID是一个主键,所以应该是不能修改的,也就是只读的,但是无论上面的那一种方法,都需要在建立这个Student对象并保存后设定一个ID,那么之个ID属性似乎又不能是只读的.这个问题我一直都觉得很困惑,也许上述的想法本身就不对呢?
2、Student对象到底应该在哪里创建?如果用上面的CreateStudent的话,很明显是在IMYDB中创建并返回,而用SaveStudent的话刚应该是在客户端创建。那么如果希望取得一个已存在DB中的的学生或课程对象时,应该怎么做呢?似乎应该使用类似
IMYDB.GetStudent(sId:Integer):IStudent;
或IMYDB.GetStudent(in sId:Integer;out sStudent: IStudent);
来取得这个对象.但是在Type Library编辑器中,无法定义上面的两个方法.似乎是COM+对象只能返回HRESULT,而想定义GetStuent(in sId:Integer;out sStudent: IStudent);这种方法也不成功,即使将sStudent定义成IUnknow * 也提示OUT参数应该是一个指针.
以上的这些问题让我觉得很困惑,是不是最初的想法就已经不对了呢?通常的三层应该一般地设计思路是怎样的呢?希望各位高手能不吝赐教!不胜感激!!