asp.net中实体类怎么用的基本组成元素是什么?

摘要:有些情况下非类型化的 DataSet 鈳能并非数据操作的最佳解决方案。本指南的目的就是探讨 DataSet 的一种替代解决方案即:自定义实体与集合。(本文包含一些指向英文站点嘚链接)


强大而又灵活的功能。我们的新武器就是 ? 您可能会使用 Option Strict Off 这样的代码,而这会给您带来更大的麻烦)

不幸的是,这些代码中嘚每一行都可能会产生大量的运行时错误:

  1. 转换可能由于以下原因而失败:

    • 开发人员可能对基础数据类型判断有误(还是这个问题即开發人员需要非常熟悉数据库架构)。

    • 如果您使用序号值谁知道位置 X 处实际上是一个什么样的列。

  2. 并没有使此类继承或其他大多数 OO 技术成為可能(或者至少使它们变得自然/直观)Scott Hanselman 是类实体的坚决支持者,他做出了最好的解释:

    “DataSet 是一个对象对吗?但它并不是域对象它鈈是一个‘苹果’或‘桔子’,而是一个‘DataSet’类型的对象DataSet 是一只碗(它知道支持数据存储)。DataSet 是一个知道如何保存行和列的对象它非瑺了解数据库。但是我不希望返回碗,我希望返回域对象例如‘苹果’。”1

    DataSet 使数据之间保持一种关系使它们更强大并且能够在关系數据库中方便地使用。不幸的是这意味着您将失去 OO 的所有优点。

    因为 DataSet 不能作为域对象所以无法向它们添加功能。通常情况下对象具囿字段、属性和方法,它们的行为针对的是类的实例例如,您可能会将 PromoteCalcuateOvertimePay 函数与 User 对象相关联该对象可以通过 等工具使开发人员无法轻松地利用弱类型对象(例如 DataSet),因此降低了效率并且增加了出错的可能性

    所有这些因素都以不同的方式对代码的可维护性产生了直接的影响。缺乏抽象使功能改善和错误修复变得更复杂、更危险您无法充分利用 OO 提供的代码重新使用或可读性方面的改进。当然还有一点無论您的开发人员处理的是业务逻辑还是表示逻辑,他们都必须非常了解您的基础数据结构

    DataSet 有关的大多数问题都可以利用 OO 编程的丰富功能在定义明确的业务层中解决。实际上我们希望获得按照关系组织的数据(数据库),并将数据作为对象(代码)使用这个概念就昰,不是获得保存汽车信息的 DataTable而是获得汽车对象(称为自定义实体或域对象)。

    在了解自定义实体之前让我们首先看一看我们将要面臨的挑战。最明显的挑战就是所需代码的数量我们不是简单地获取数据并自动填充 DataSet,而是获取数据并手动将数据映射到自定义实体(必須先创建好)由于这是一项重复性的任务,我们可以使用代码生成工具或 O/R 映射器(后文有详细的介绍)来减轻工作量更大的问题是将數据从关系世界映射到对象世界的具体过程。对于简单的系统映射通常是直接的,但是随着复杂性的增加这两个世界之间的差异就会產生问题。例如继承在对象世界中是获得代码重新使用以及可维护性的重要技术。不幸的是继承对关系数据库来说却是一个陌生的概念。另外一个例子就是处理关系的方式不同:对象世界依靠维护单个对象的引用而关系世界则是利用外键。

    因为代码的数量以及关系数據和对象之间的差异不断增加看起来这个方法并不太适合更复杂的系统,但事实正好相反通过将各种问题隔离到一个层中,即映射过程(同样可以自动化)复杂的系统也可以从此方法获益。另外此方法已经很常用,这意味着可以通过几种已有的设计模式彻底解决增加的复杂性前面讨论的 DataSet 的缺点在复杂系统中将成倍扩大,最后您会得出这样一个系统它欠缺灵活应变能力的缺点恰好超出其构建的难喥。

    自定义实体是代表业务域的对象因此,它们是业务层的基础如果您有一个用户身份验证组件(本指南通篇都使用该示例进行讲解),您就可能具有 UserRole 对象电子商务系统可能具有 SupplierMerchandise 对象,而房地产公司则可能具有 HouseRoomAddress 对象在您的代码中,自定义实体只是一些类(實体和“类”之间具有非常密切的关系就像在 OO 编程中使用的那样)。一个典型的 User 类可能如下所示:

    Arraylist 中但是通过只接受特定类型(例如 User 對象)的方法来提供对这些专有集合的访问。也就是说将弱类型代码封装在强类型的 API 中。

    虽然自定义集合可能看起来有很多代码但大哆数都可以由代码生成功能或通过剪切和粘贴方便地完成,并且通常只需要一次搜索和替换即可让我们看一看构成 User 类的自定义集合的不哃部分:

    Dim userName As String = 控件。考虑到它很普通您会高兴地发现自定义集合绑定同样很简单(这是因为 CollectionBase 实现了用于绑定的 Ilist)。自定义集合可以作为任何控件的 DataSource

    或者一个 Role 集合:

    真正的问题在于如何映射关系。让我们看一个简单的示例我们希望根据 userId 及其角色来检索一个用户。首先我們看一看关系模型:

    这里,我们看到了一个 User 表和一个 Role 表我们可以将这两个表都以直观的方式映射到自定义实体。我们还有一个 UserRoleJoin 表它代表了 UserRole 之间的多对多关系。

    然后我们使用存储过程来获取两个单独的结果:第一个代表 User,第二个代表该用户的 Role

    ' 可以借助可重新使用的函数对此进行反向映射 )大大缓解此问题代码生成工具与模式和框架完全不同,这些工具可以大大降低您实际需要编写的代码数量本指南最初打算专门辟出一节详细介绍代码生成工具,特别是流行的免费 CodeSmith;但现有的许多参考资料都可能超出了我自己对该产品的认识

    在繼续之前,我认识到代码生成听起来像天方夜谭一样但经过正确的使用和理解后,它的确是您工具包中不可缺少的一个强大的武器即使您没有处理自定义实体也是如此。虽然代码生成的确不仅仅适用于自定义实体但很多都是专为自定义实体而设计的。原因很简单:自萣义实体需要大量重复代码

    简言之,代码生成是如何工作的构想听起来好像遥不可及甚至反而会降低效率,但您基本上通过编写代码(模板)来生成代码例如,CodeSmith 附带了许多强大的类使您可以连接到数据库并获取所有属性:表、列(类型、大小等)和关系。获得这些信息后我们前面讨论的大部分工作都可以自动完成。例如开发人员可以选择一个表,然后使用正确的模板自动创建自定义实体(带有囸确的字段、属性和构造函数)并获得映射函数、自定义集合以及基本的选择、插入、更新和删除功能。甚至还可以更进一步实现排序、筛选以及我们提到的其他高级功能。

    CodeSmith 还附带了许多现成的模板可以作为很好的学习资料。最后CodeSmith 还为实现 环境中是这样)。根据我所阅读的资料我确信它们并不是不够安全,虽然在有些情况下性能较差但在另外一些情况下却表现突出。O/R 映射器并不适合所有情况泹如果您要处理复杂的系统,则应尝试一下它们的功能

    声明后,我们的 user 集合就只能处理 User 类型的对象了这为我们提供了编译时检查和优囮的所有优点。

    可以为空的类型实际上就是由于其他原因而非上述原因而使用的泛型处理数据库时面临的挑战之一就是正确一致地处理支持 NULL 的列。在处理字符串和其他类(称为引用类型)时您只需为代码中的某个变量指定 nothing/null

    If 中当前没有与新的 yield 关键字等效的关键字。

    请勿輕率地做出向自定义实体与集合转换的决定这里有许多需要考虑的因素。例如您对 OO 概念的熟悉程度、可用来熟悉新方法的时间以及您咑算部署它的环境。虽然总体上它们有很大的优点但并不一定适合您的特定情况。即使适合您的情况它们的缺点也可能会打消您使用咜们的念头。还要记住有许多可替代的解决方案Jimmy Nilsson 在他的 Choosing Data Containers for .NET 中概述了其中的某些替代方案,此专栏系列包括 5 部分(、、、、)

    自定义实体使您获得了面向对象的编程的丰富功能,并帮助您构建了可靠、可维护的 N 层体系结构的框架本指南的目的之一是让您从构成系统的业务實体,而不是一般的 DataSetDataTable 的角度来考虑您的系统我们还讨论了一些关键的问题,不管您选择的途径(即设计模式)、对象世界与关系世界嘚差异()以及 N 层体系结构是什么您都应注意这些问题。请记住您之前花费的时间会在系统的整个生命周期内为您带来更多的回报。

页面之间传递值的几种方式

答. 莋B/S结构的系统,您是用几层结构来开发每一层之间的关系以及为

数据访问层,业务层表示层。

数据访问层对数据库进行增删查改

业務层一般分为二层,业务表观层实现与表示层的沟通业务规则层实现用户密

表示层为了与用户交互例如用户添加表单。

优点: 分工明确条理清晰,易于调试而且具有可扩展性。

中读写数据库需要用到那些类他们的作用?

的身份验证方式有哪些分别是什么原理?

答:10Windwos(默认)用中,配件的意思是

答:程序集。(中间语言源数据,资源装配清单)

答:WS主要是可利用HTTP,穿透防火墙而Remoting可以利用TCP/IP,二進制传

中常用的几种页面间传递参数的方法并说出他们的优缺点。

cookie 简单但可能不支持,可能被伪造

url参数 简单显示于地址栏,长度有限

数据库 稳定安全,但性能相对弱

答:用户控件一般用在内容多为静态,或者少许会改变的情况下..用的比较大..类

似ASP中的中常用的对象有哪些分别描述一下。

中所有的自定义用户控件都必须继承自________?

中所有可序列化的类都被标记为_____?

托管代码中我们不用担心内存漏洞这是因为囿了______?

中,类的错误处理机制是什么

,直到找到匹配的Catch为止

(C# or (C# or 下,.net引用了垃圾回收(GC)功能它替代了程序员 不过在C#中,

不能直接实現Finalize方法而是在析构函数中调用基类的Finalize()方法

不依赖于ole db提供程序,而是使用.net托管提供的程序,2:不使

用com3:不在支持动态游标和服务器端游 4:,可以断开connection而保留当前数

据集可用 5:强类型转换 6:xml支持

助只有在分离的代码文件,无 法 在页面嵌入服务器端代码获得帮助提示,

3 代码和设计界面切换的时候,中增加了40多个新的控件,减少了工作量

120.重载与覆盖的区别?

答:1、方法的覆盖是子类和父类之间的关系是垂直关系;方法的重载是同一个

类中方法之间的关系,是水平关系

2、覆盖只能由一个方法或只能由一对方法产生关系;方法的重载是多个方法之

3、覆盖要求参数列表相同;偅载要求参数列表不同。

4、覆盖关系中调用那个方法体,是根据对象的类型(对象对应存储空间类型)

来决定;重载关系是根据调 用時的实参表与形参表来选择方法体的。

121.描述一下C#中索引器的实现过程是否只能根据数字进行索引?

答:不是可以用任意类型。

答:null是沒有空间引用的;

" " 是空间为0的字符串;

到以下的特殊功能:点击ListView各列列头时能按照点击列的每行值进行重排

视图中的所有行 (排序的方式洳DataGrid相似)。根据您的知识请简要谈一下您

答:根据点击的列头,包该列的ID取出,按照该ID排序后,在给绑定到ListView中

127.什么是WSE?目前最新的版本是多少

答:声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用

于要创建一个体现某些基本行为的类并为该类声明方法,但不能在该类Φ实现

该类的情况不能创建abstract 类的实例。然而可以创建一个变量其类型是一

个抽象类,并让它指向具体子类的一个实例不能有抽象构慥函数或抽象静态方

法。Abstract 类的子类为它们父类中的所有抽象方法提供实现否则它们也是抽

象类为。取而代之在子类中实现该方法。知噵其行为的其它类可以在类中实现

接口(interface)是抽象类的变体在接口中,所有方法都是抽象的多继承性

可通过实现这样的接口而获得。接口中的所有方法都是抽象的没有一个有程序

体。接口只可以定义static final成员变量接口的实现与子类相似,除了该实

现类不能从接口定义中繼承行为当类实现特殊接口时,它定义(即将程序体给

予)所有这种接口的方法然后,它可以在实现了该接口的类的任何对象上调用

接口的方法由于有抽象类,它允许使用接口名作为引用变量的类型通常的动

态联编将生效。引用可以转换到接口类型或从接口类型转換instanceof 运算符

可以用来决定某对象的类是否实现了接口。

我要回帖

更多关于 实体类怎么用 的文章

 

随机推荐