1

我有以下数据库表可以使用,我对 oop 有点陌生,所以我想我会在这里问。

assignment
----------
id
person_id
assigned_address_id
position_id

person
----------
person_id
current_address_id
name
ssn
drivers_license

address
---------
id
address_number
address_street
address_city
address_state 
address_zip

position
---------
id
description
rate

我创建了以下类

Person Class
int? id
Address currentAddress
string Name
string ssn
string drivers_license

PersonAssignment Class
id
person_id
Address assignedAddress
Position assignedPosition 

Address Class
string address_number
string address_street
string address_city
string address_state 
int address_zip 

Position Class
int? id
string description
double payment_rate 

我还为访问 Dal.Repository 并对每个对象执行 crud 方法的每个对象创建了单独的服务类。IE

PersonService Class
Update(Person p)
Insert(Person p)
GetListOfPeople()
GetPerson()

PersonAssignmentService Class
Update(PersonAssignment p)
Insert(PersonAssignment p)
GetListOfPeopleAssignments()
GetAssignment()

我也有每个对象的存储库

IE

PersonRepository Class
Update(PersonAssignment p)
Insert(PersonAssignment p)
GetListOfPeopleAssignments()
GetAssignment()

在包含人员分配和人员个人详细信息的网页上,我发现自己正在调用 PersonService 和 PersonAssignmentService。

这似乎是很多工作。难道我做错了什么?也许有一种更简单的方法来设计这样的东西,我就是不明白。

谢谢你的帮助

谢谢

4

5 回答 5

1

你需要做的是设计和实现一个数据访问层:

http://rlacovara.blogspot.com/2009/02/high-performance-data-access-layer.html

这篇文章是迄今为止我在描述如何编写数据访问层方面看到的最好的文章。作者描述了您需要创建 DTO(数据传输对象)来将数据从数据访问层移动到业务层(或移动到可以将它们转换为原生应用程序类的另一层)。他提供了基类和代码来帮助您处理数据传输对象、填充 DTO 的代码以及将 DTO 保存到数据库的代码。

该系列共有三篇文章,我建议阅读整套。

于 2009-04-21T01:21:56.360 回答
0

数据库设计和类有时可能很难批评,而且很大程度上取决于您的业务规则和您拥有的事务类型。

对于初学者,我不会为一个人的地址创建一个单独的表,也不会创建任何定义地址的特定类。

我不确定您使用的是哪种编程语言,但可能值得您花时间查看 ORM(对象关系映射)

于 2009-04-21T01:13:54.807 回答
0

我不是 100% 确定你的网页做了什么,但假设你有一个 PersonAssignment Id 并且你正在从中检索一个 PersonAssignment 对象,然后是 Person 对象本身,以下可能会使它更容易:

在 PersonAssignment 类中,添加一个引用 Person 对象的属性,而不仅仅是一个 person_id。从你的例子:

PersonAssignment Class
id
person_id
Person person
Address assignedAddress
Position assignedPosition

在 GetPersonAssignment 方法(我假设它带有一个参数)中,做一些工作来填充 Person 对象。您还需要添加到 Insert 和 Update 方法以考虑到这一点。

于 2009-04-21T01:25:00.037 回答
0

根据您的规则,每个人似乎只能有一个地址,因此如果有人搬家,您会丢失他的最后一个地址,因为地址表中没有 person_id。

但是,这是吹毛求疵。

如上所述,使用 DAO 是一个绝妙的主意。保持逻辑分开。

我会从编写 DAO 开始,确保它正在做它应该做的所有事情,然后在下一层工作,这样你就可以对数据库进行任何需要的更改。

如果您是 C# 新手,您可能想查看 .NET 3.5 提供的各种工具,因为有许多更改使数据库访问更简单,以抽象出实际数据库。

这样做的一个优点是,您的某些数据源可能来自 XML 文件,并且无论数据源的实际来源如何,您的 DAO 都可以正常工作。

于 2009-04-21T01:40:03.573 回答
0

听起来你在一个由其他人设计的框架内工作,你有服务类、存储库和 DAL,现在你拥有所有这些东西,你正在查看一大堆代码并询​​问“isn没有更简单的方法”。简短的回答是肯定的,总有更简单的方法。有多少开发人员,就有多少种不同的方式进行数据访问。您使用的模型相当复杂,听起来它遵循领域驱动设计的原则。DDD 是一种很棒的方法,它提供了出色的关注点分离和高可测试性。但它也需要大量的管道代码,而且大多数.Net 程序员都不太了解它,因此获得帮助可能很困难。我确实认为这是构建企业应用程序的最佳方式,但它

如果您正在做一个小型项目,您可能需要考虑完全绕过 BLL,没有服务类,没有存储库,只需有一个包含实体类的 Common Lib/项目,并构建一个包含直接填充的数据访问方法的 DLL 和保存您的实体。

一个更简单的方法是取消实体类,只让您的 DLL 返回包含您的实体数据的 ADO.Net 数据表。这种方法失去了实体类的强类型,但更容易实现。

另一种方法是使用实​​体框架。EF 将为您完成所有这些工作,并将生成强类型实体类。习惯 EF 确实需要一些时间,但是一旦您了解如何使用它,它可以大大减少您编写持久性代码所花费的时间。有关 EF 的一些好的教程,请查看Rob Bagby 的博客

于 2009-04-21T14:40:30.950 回答