类设计帮助

时间:2009-04-21 00:51:06

标签: c# asp.net class-design

我有以下数据库表可供使用,我对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的对象创建了Seprate Service Classes,并对每个对象执行crud方法。 即。

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

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

我还有每个对象的存储库

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

在我的网页上,其中包含人员分配和个人详细信息,我发现自己称之为PersonService和PersonAssignmentService。

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

感谢您的帮助

由于

5 个答案:

答案 0 :(得分:1)

您需要做的是设计和实施数据访问层:

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

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

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

答案 1 :(得分:0)

数据库设计和类有时很难批评,其中很大一部分实际上取决于您的业务规则和您拥有的交易类型。

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

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

答案 2 :(得分:0)

我不是百分之百确定你的网页是做什么的,但假设你有一个PersonAssignment Id并且你从那里检索一个PersonAssignment对象,然后是Person对象本身,下面的内容可能会更容易:

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

PersonAssignment Class
id
person_id
Person person
Address assignedAddress
Position assignedPosition

在GetPersonAssignment方法(我假设接受一个参数)中,做一些工作来填充Person对象。您还需要添加插入和更新方法以将此考虑在内。

答案 3 :(得分:0)

根据您的规则,每个人只能拥有一个地址,所以如果有人移动,您将失去他的最后一个地址,因为地址表中没有person_id。

但是,这是挑剔。

如上所述,使用DAO是一个很好的主意。保持逻辑分离。

我将从编写DAO开始,确保它正在执行它应该执行的所有操作,然后处理下一层,这样就可以对所需的数据库进行任何更改。

如果您不熟悉C#,您可能需要查看.NET 3.5提供的各种工具,因为有许多更改可以简化数据库访问,以抽象出实际的数据库。

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

答案 4 :(得分:0)

听起来你是在一个由其他人设计的框架中工作,你有服务类,存储库和DAL,现在你已经拥有了所有这些东西,你正在查看大量的代码和问“不是一种更简单的方法”。简短的回答是肯定的,总有一种更简单的方法。进行数据访问的方式与开发人员一样多。您使用的模型相当复杂,听起来遵循域驱动设计的原则。 DDD是一种很好的方法,它提供了极好的关注点分离和高可测性。但它也需要大量的管道代码,并且大多数.Net程序员都不太了解它,所以获得帮助可能很难。我认为这是构建企业应用程序的最佳方式,但如果您不熟悉OOP,它不是最适合您的模型。

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

更简单的方法是取消实体类,只让你的DLL返回包含实体数据的ADO.Net DataTables。这种方法失去了实体类的强类型,但实现起来要容易得多。

另一种方法是使用Entity Framework。 EF将为您完成所有这些工作,它将生成强类型实体类。习惯EF需要一段时间,但一旦理解了如何使用它,它就可以大大减少编写持久性代码所需的时间。有关EF的一些好的教程,请查看Rob Bagby's blog