1.理解概念
先理解一下两个概念。
模型
模型是指数据的结构类型,以及可调用的方法。对面向对象编程方法来说,其实就是类。模型类就是一个描述数据的类。只有把数据按一定方式描述出来,我们才能在程序中方便地使用它。
存储库
直白解释就是存储数据的仓库。通常就是用数据库来存储数据,当然也有文件存储等其他存储方式。存储库的作用很显然是将数据永久保存起来。
2.创建数据模型
我们在【Asp.net入门06】第一个ASP.NET 应用程序(4)-案例说明中定义的案例项目比较简单,只需要一个简单的数据模型。下面是添加这个数据模型(类)的操作步骤。
操作步骤
第一步:在Solution Explorer(解决方案资源管理器,记住这两个单词,以后不解释了)中右键单击PartyInvites项目(注意是点击项目,不是点击解决方案),然后从弹出菜单中选择Add→Class(类)。(另一种方法是从弹出菜单中选择“新建项”也是一样的效果)
提示 如果没有看到Class菜单项或该菜单项处于禁用状态,说明Visual Studio调试器可能正在运行。当它正在运行应用程序时,Visual Studio会限制你对项目进行更改。请从Debug菜单中选择Stop Debugging(停止调试),然后重试。
第二步:第一步之后,Visual Studio将会显示Add New Item(添加新项)对话框,其中包含你可以添加到ASP.NET项目中的所有项的模板。确保“类模板”处于选中状态,将其名称设置为GuestResponse.cs,然后单击Add按钮。Visual Studio将创建一个新的C#类文件,并打开文件以供编辑。设置该文件的内容,使其与代码清单1-4的内容相一致。
代码清单1-4 GuestReponse类
代码解释
(1)类成员:属性
上述代码是一个C#类的定义。其中,类名称是GuestResponse,该类有4个成员,这种成员在C#中有一个专门的名字:属性。其实它相当于java中的getXXX和setXXX成员方法。上述成员属性是一种简化写法,完整写法是:
图2 Name属性的完整写
提示
java中给一个成员变量提供读写功能的写法是: class GuestResponse{
private String name;
public String getName(){
return name;
}
public String setName{String n}{
name = n;
}
}
(2)可空类型:bool?
bool类型变量可以赋的值只有两个:true和false。bool?也是一种数据类型,bool?变量可以赋的值有三个:true、false和null。null表示既不是true也不是false,值为空。后面将解释WillAttend属性选择这种数据类型的原因。
3.创建存储库
GuestReponse类实例表示晚会嘉宾的回函。这需要一个存储库来存储所创建的GuestResponse对象。在实际应用中,此存储库通常为数据库。我们后面会创建一个更加真实的ASP.NET应用程序时,将介绍如何设置和使用数据库。在本章中,我们只需要一种简单快捷的存储方法,因此,示例将对象存储在内存中。这样做的好处是方便,但每次停止或重新启动应用程序,数据都会丢失。对现实中的Web应用程序来说,这可能是一个奇怪的选择,但就本章来说,这是一个不错的选择。
要定义存储库,在项目中添加一个新的类文件ResponseRepository.cs,这个类的作用是实现实现将数据存储在内存中,并对数据进行读写。请确保该文件的内容与代码清单1-5的内容相一致。
代码清单1-5:ResponseRepository.cs
代码分析
第11句:实例化一个链表,链表里存放GuestResponse对象。
第18句-21句:返回包含所有受邀者信息的链表。很明显,这是一个成员函数,并不是属性或者成员变量。IEnumerable<T>是一种接口类型,因为List<T>是继承自IEnumerable<T>的,所以返回的resposes对象是没有问题的。这涉及到使用接口实现多态的知识,这里不专门展开,请自行参考浅谈C# 多态的魅力(虚方法,抽象,接口实现)
请课后自行学习接口的知识,弄清接口的作用和基本用法,并编写一个简单的接口程序。
第23句-26句:往存储库中增加一个邀请(GuestResponse对象)。这里是直接增加到内存链表responses对象中(实际项目中往往是写到数据库里)。
第10句和第13-16句:这是一种软件设计模式,名称叫单例模式,简单点说就是保证这个程序在运行时,系统中只有一个ResponseRepository实例。详细介绍请参考:C#设计模式(1)——单例模式
存储库提供了各种用于创建、读取、更新和删除数据对象的方法(统称为CRUD方法,即Create、Read、Update、Delete),但我们只需要读取此应用程序中的所有数据对象,并向其中添加新对象即可。后面将介绍更加典型的存储库。