【IT168技术文档】
对领域类的添加、删除、修改是每个系统的主要任务。下面介绍系统是如何在实现这些操作,以及如何利用泛型来减少重复代码。根据前面说到的业务层和数据访问层的关系。要添加,删除,修改信息,必需先在业务层定义业务层用到的数据访问层接口。
这样我们就不用到处粘贴修改Dao接口代码了。所有的具体Dao接口只要继承泛型的IDao并给出类型就自动有了基本的持久化操作方法定义。定义完业务层所需要的接口。接下来要在数据访问层实现这些接口。下面给出StudentDao和TeacherDao的代码。其中用两个持久化方法的代码来说明数据访问层是如何利用NHibernate来实现对Student、Teacher的持久化操作的。
以上两个Dao实现方法只是为了简单的说明不是真实代码。我们发现两个Dao的具体实现也是如此的相似以至于很轻易就想到粘贴复制就可以写其他的Dao实现代码。但是一旦我们到处粘贴复制我们的代码时候我们就应该意识到我们应该来抽象。用抽象来消除重复。这里依然用泛型来解决问题。先定义一个抽象类来实现上面提到的泛型接口。1.StudentDao namespace ExaminationSystem.DAL { public class StudentDao:IStudentDao { private static ISessionFactory sessionFactory = new Configuration().Configure().BuildSessionFactory(); public Student GetById(long id) { ISession session = sessionFactory.OpenSession(); return session.Get<Student>(id); session.Close(); } public void Save(Student student) { ISession session = sessionFactory.OpenSession(); ITransaction transation = session.BeginTransaction(); session.Save(student); transation.Commit(); session.Close(); } } } 2.TeacherDao namespace ExaminationSystem.DAL { public class TeacherDao:IStudentDao { private static ISessionFactory sessionFactory = new Configuration().Configure().BuildSessionFactory(); public Teacher GetById(long id) { ISession session = sessionFactory.OpenSession(); return session.Get<Teacher>(id); session.Close(); } public void Save(Teacher teacher) { ISession session = sessionFactory.OpenSession(); ITransaction transation = session.BeginTransaction(); session.Save(teacher); transation.Commit(); session.Close(); } } }
namespace ExaminationSystem.DAL { public abstract class AbstractDao<T>:IDao<T> { private static ISessionFactory sessionFactory = new Configuration().Configure().BuildSessionFactory(); public T GetById(long id) { ISession session = sessionFactory.OpenSession(); return session.Get<T>(id); session.Close(); } public void Save(T obj) { ISession session = sessionFactory.OpenSession(); ITransaction transation = session.BeginTransaction(); session.Save(obj); transation.Commit(); session.Close(); } } } 下面是更改后的StudentDao和TeacherDao public class StudentDao : AbstractDao<Student>, IStudentDao { } public class TeacherDao : AbstractDao<Teacher>, ITeacherDao{ }