【问题标题】:Business object to multiple tables多个表的业务对象
【发布时间】:2010-02-13 17:28:50
【问题描述】:

我想尝试自定义代码,这是针对我的 uni 项目的。如果我有表 - UserCarCarMakeCarModel,该怎么办。

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

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

【问题讨论】:

    标签: asp.net


    【解决方案1】:

    嗯,您提到了 3 层架构,所以我猜您正在研究数据/应用程序/表示方法。当然,为了使这一点有意义,您可能需要提供比您在问题中提供的简要详细信息更多的信息。 例如,当我们谈论应用程序层时,如果您有“应用程序逻辑”,那么拥有一个真的很有意义。有了您的简短信息,除了将您的数据显示到屏幕之外,并没有真正的应用程序逻辑。有关多层(或 n 层)架构(以及 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_ 前缀来表示这个类属于应用层。请注意,我宁愿将这 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~ 表示层: 最后,我们可以在屏幕上显示一些东西。这里重要的是要记住,您的表示层不应该直接处理数据层,而只能处理应用程序层。 因此,例如,如果我必须通过 id 检索 UserCar 并将其显示在网页中,我可以编写类似这样的内容

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

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

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

    1. 谈到数据存储:我们只在数据层中完成了这项工作;
    2. 处理应用程序逻辑,例如将不同表中的数据“合并”到一个逻辑单元中:我们专门在应用程序层中完成了这项工作;
    3. 处理呈现以筛选数据以及 - 更笼统地说 - 与用户交互:我们仅在呈现层中执行此操作。

    HTH。

    【讨论】:

      【解决方案2】:

      将表映射到数据访问对象并在业务层中使用它们。您的每个 DAO 都将具有与相应表中的每一列相对应的属性;使用您喜欢的任何 ORM(例如 NHibernate),一切顺利。

      【讨论】:

      • 我需要创建哪些属性和类?对于每个表或?
      猜你喜欢
      • 2012-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多