【发布时间】:2012-04-03 02:07:25
【问题描述】:
一些背景:这与我萌芽的愿望有关,即构建多层 Web 应用程序:
- C# ASP.NET 网络表单
- C# POCO 业务对象
- 某种 DAL...SQL(或者如果我能弄明白的话可能是 EF4)
例如,我真的不想要让我的表示层直接与 EF 实体对话的响应。
我已经使用 C# ASP.NET 和 SQL 进行自己的 Web 开发已有 10 年了,但在正式的 OOAD 方面我仍然是一个新手。我最近一直在热情地追求这项技能,但我还是新手,有些东西我无法完全理解。我希望有人能以一种能带来顿悟的方式来解释它:
假设我创建了一个以某种方式管理 People 的 Web 应用程序,并且我的 Person 对象必须具有诸如 FirstName、LastName、HairColor、EyeColor、Ethnicity、StateOrProvince 等属性。我' m 使用 SQL Server 进行持久性...所以常识会规定 People 表中的各个字段都是外键:
FirstName varchar(50)
LastName varchar(50)
HairColor tinyint
EyeColor tinyint
Ethnicity tinyint
StateOrProvince tinyint
显然,这意味着我对每个字段都有相应的查找表(即 HairColors 表、EyeColors 表、Ethnicities 表等),并且每个查找表都有一个 ID 和一个名称。当然,只要我想显示有关人员的任何有用信息,这些查找表中的名称字段就会与我的人员数据连接。
该网站的一些主要特点是:
1.) 在 Gridview 中枚举人员(FirstName、LastName、HairColor、EyeColor、Ethnicity、StateOrProvince)
2.) 在只读页面上显示个人的详细信息(名字、姓氏、头发颜色、眼睛颜色、种族、州或省)
3.) 允许用户在更新页面上更新个人的个人数据(FirstName、LastName、HairColor、EyeColor、Ethnicity、StateOrProvince)
案例#1 如果我在 gridview 中枚举 Person 对象的集合...每个 Person 实例都需要将其 HairColor、EyeColor、Ethnicity、StateOrProvince 属性显示为作为字符串才有意义(即来自SQL 查找表,而不是其 ID)。显然,我的 SQL sproc 将有一些 JOIN 来为我提供在每个 Person 实例中填充这些文本属性所需的适当字符串数据。
案例#2 同样,我的 sproc 将有一个 JOIN 来带回人类可读的属性名称作为字符串,我会使用 myPerson.HairColor、myPerson.EyeColor 等将它们显示在只读标签控件中。 p>
案例#3 在这里,我将显示一个页面,其中包含每个属性的下拉列表(即 value=HairColorId,Text=HairColorName)。我的直觉是使用每个属性的 IDs(类似于 myPerson.HairColorId),以便循环访问 DDL 项并选择一个代表 People 表当前持有的头发颜色的值对于这个人。如果用户在任何属性 DDL 中选择了不同的内容,我需要将适当的 SelectedId 值传递给 UPDATE sproc,并修改 People 表中此特定 Person 的值。
这让我想到了一个终极问题:
如何最好地设计一个 Person 对象,使其同时包含 HairColor、EyeColor、Ethnicity、StateOrProvince 的 ID 和名称,以便随后在 显示 时使用 名称 > 信息,但 ID 用于初始化更新 DDL 控件...并最终处理 更新?
我对此进行了反思...我得出的结论是,我需要创建类来表示 HairColor、EyeColor、Ethnicity、StateOrProvince 属性。
然后是我的 Person 类,而不是这样的:
public class Person
{
string FirstName { get; set; }
string LastName { get; set; }
int HairColorId { get; set; }
string HairColorName { get; set; }
int EyeColorId { get; set; }
string EyeColorName { get; set; }
int StateOrProvinceId { get; set; }
string StateOrProvinceName { get; set; }
string StateOrProvinceCode { get; set; }
}
将改为扩展为这样的内容:
public class HairColor
{
int Id { get; set; }
string Name { get; set; }
}
public class EyeColor
{
int Id { get; set; }
string Name { get; set; }
}
public class StateOrProvince
{
int Id { get; set; }
string Name { get; set; }
string Code { get; set; }
}
public class Person
{
HairColor HairColor { get; set; }
EyeColor EyeColor { get; set; }
StateOrProvince StateOrProvince { get; set; }
public Person()
{
// how do I initialize a Person from a SQL data row?
}
}
但是,如果我的 Person 类确实像上面那样......我到底如何最好地从我从 SQL 查询返回的给定数据行中初始化它(无论是单独还是在集合中)?我似乎记得我不应该在构造函数中更新东西(即 this.HairColor = new HairColor(dr["HairColorId"), dr["HairColorName"];)...所以我想知道如何打电话给
public static IEnumerable<Person> GetPeople()
{
...
}
在我的 BLL 中,可能会在将每个用户的数据添加到集合之前将其填满?
真的希望有人可以在这里给我一个“哈哈”的时刻......
【问题讨论】: