我想尝试自定义代码,这是我的uni项目。如果我有表格 UserCar , CarMake 和 CarModel ,该怎么办?
UserCar - userId, carId, carMakeId, CarModelId
CarMake - CarMakeId, MakeName
CarModel - CarModelId, ModelName
所以我想在页面上显示用户车,使用3层架构。那我该怎么映射这个表???业务对象或对象???你能帮帮我吗?
答案 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个问题:
HTH。
答案 1 :(得分:1)
将表映射到数据访问对象并使用业务层中的表。您的每个DAO都将具有与相应表中每列相对应的属性;使用你喜欢的任何ORM(例如NHibernate),你就可以了。