2009-04-21 85 views
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 

我还创建了Seprate服务类为每个访问Dal.Repository和每个对象执行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。

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

感谢所有帮助

感谢

回答

0

数据库设计和类可有时很难批判和大部分是真的取决于你的业务规则,你有交易的类型。

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

我不知道你用的是什么编程语言,但它很可能是值得你花时间检查了ORM(对象关系映射)

+0

从标签看起来像他正在使用C#... – Damovisa 2009-04-21 01:18:11

1

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

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

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

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

+0

谢谢,我会看看这个。 – zSynopsis 2009-04-21 01:35:38

0

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

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

PersonAssignment Class 
id 
person_id 
Person person 
Address assignedAddress 
Position assignedPosition 

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

0

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

但是,这是挑剔的。

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

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

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

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

0

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

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

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

另一种方法是使用实​​体框架。 EF将为您完成所有这些工作,它将生成强类型的实体类。使用EF需要一些时间,但是一旦您了解了如何使用它,它可以大幅减少您编写持久代码所需的时间。对于EF的一些很好的教程,看看Rob Bagby's blog