业务对象到多个表

时间:2010-02-13 17:28:51

标签: asp.net

我想尝试自定义代码,这是我的uni项目。如果我有表格 UserCar CarMake CarModel ,该怎么办?

UserCar - userId, carId, carMakeId, CarModelId 
CarMake - CarMakeId, MakeName 
CarModel - CarModelId, ModelName 

所以我想在页面上显示用户车,使用3层架构。那我该怎么映射这个表???业务对象或对象???你能帮帮我吗?

2 个答案:

答案 0 :(得分:2)

嗯,你提到了3层架构,所以我猜你正在研究一种数据/应用/演示方法。当然,为了使其更有意义,您可能需要提供的不仅仅是您在问题中提供的简要细节。 例如,当我们谈论应用程序层时,如果你有“Appalication logic”,那么拥有一个它真的很有意义。除了您的简要信息之外,除了将数据显示到屏幕之外,还没有其他应用程序逻辑。有关Multitier(或n-tier)体系结构(以及3层作为子集)主题的更多信息,请参阅this wikipedia条目。

话虽这么说,如果你在排序的数据存储中有3个表(例如数据库),我们可以快速制作这样的3层应用程序。

1~数据层: 创建与存储表匹配的类,例如(使用C#语法):

public class DT_UserCar
{
  public string userId;
  public string carId;
  public string carMakeId;
  public string CarModelId;
}

我正在使用DT_前缀来指示此类属于数据层。

此外,您需要使用一些代码来从存储中读取这些类的实例,并可能将其保存到存储中。当然你已经有了选择。您可以创建一个单独的类,知道如何执行所有操作,例如

public class Storage
{
  public DT_UserCar ReadUserCar(string carId) { /* implementation */ }
  public DT_CarMake ReadCarMake(string carmakeId) { /* implementation */ }
  /* and so on... */
}

或者您可以决定每个类应该知道如何将自身序列化/反序列化到存储中,并使用:

public class DT_UserCar
{
  public string userId;
  public string carId;
  public string carMakeId;
  public string CarModelId;

  public static DT_UserCar Read(string carId) { /* implementation */ }
  public void Write() { /* implementation */ }
}

第三种,更好的替代方案(对于更大的项目)是找到一个第三方工具,为您处理所有这些。毕竟,鉴于存储结构(例如:数据库模式),所有这些代码都可以自动化...我不会在这里详细介绍,因为您可以找到有关此类工具的大量信息(ORM工具)和他们的特点,但主要是因为它似乎不是你锻炼的一部分。

2~应用程序层: 正如我所说,你的用例似乎并没有包含很多“业务逻辑”。但是,您确实提到应该以某种方式合并来自这3个存储表的数据,因此我将把它作为您的一个业务逻辑。因此,我们应该创建一个业务类(或业务实体,或域实体,或域模型,无论您使用哪个术语,它们都有不同的含义,但有很多共同点),如下所示:

public class AT_UserCar
{
  public DT_UserCar _userCar;
  public DT_CarMake _carMake;
  public DT_CarModel _carModel;

  public AT_UserCar(DT_UserCar userCar, DT_CarMake carMake, DT_CarModel carModel)
  {
    _userCar = userCar;
    _carMake = carMake;
    _carModel = carModel;
  }
}

我正在使用AT_前缀来指示此类属于Application Tier。请注意,我宁愿将这3个作为私有属性,但为了简洁起见,我将放宽此示例代码中的其他指南。 现在,当我们从存储中读取此类的实例时,我们必须合并其中的正确DT_对象。同样,您可以将此代码放在同一个类AT_UserCar中,或者决定将其拆分为一个单独的类,如下所示:

public class AT_UserCarReader
{
  public AT_UserCar Read(string userCarId, string carMakeId, string carModelId)
  {
    DT_UserCar userCar = DT_UserCar.read(userCarId);
    DT_CarMake carMake = DT_CarMake.Read(carMakeId);
    DT_CarModel carModel = DT_Carmodel.read(carModelId);
    return new AT_UserCar(userCar, carMake, carModel);
  }
}

等效的AT_UserCarWriter类将执行接收单个AT_UserCar对象的逆操作,并将从中提取的单独对象写入数据存储器3:DT_UserCar,DT_CarMake和DT_CarModel。

请注意,此代码的大部分内容也可以自动执行,并且有大量工具可以为您处理。

3~ Presentation Tier: 最后,我们在屏幕上显示一些内容。这里重要的是要记住,您的表示层不应该直接处理数据层,而只能处理应用程序层。 所以,例如,如果我必须通过id检索UserCar并将其显示在网页中,我可以写这样的东西

AT_UserCar car = AT_UserCarReader.Read(userCarId, carMakeId, carModelId);
tbox_userId = car._userCar.userId;

当然,这是一个非常小的例子,但我希望快速浏览可以帮助你。

3层架构(通常是n层)的核心是将不同的关注点分成不同的层。如果你看一下上面的例子,我们就针对3个问题:

  1. 与数据存储交谈:我们仅在数据层中完成此操作;
  2. 处理应用程序逻辑,例如将来自不同表的数据“合并”到一个逻辑单元中:我们只在Application Tier中执行此操作;
  3. 处理呈现以筛选数据,并且 - 更一般的术语 - 与用户交互:我们仅在Presentation Tier中完成此操作。
  4. HTH。

答案 1 :(得分:1)

将表映射到数据访问对象并使用业务层中的表。您的每个DAO都将具有与相应表中每列相对应的属性;使用你喜欢的任何ORM(例如NHibernate),你就可以了。