【问题标题】:Class Design Help类设计帮助
【发布时间】:2009-04-21 00:51:05
【问题描述】:

我有以下数据库表可以使用,我对 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 方法。 即

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。

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

感谢您的帮助

谢谢

【问题讨论】:

    标签: c# asp.net class-design


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢,我会看看这个。
    【解决方案2】:

    有时很难对数据库设计和类进行批评,其中很大程度上取决于您的业务规则和您拥有的事务类型。

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

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

    【讨论】:

      【解决方案3】:

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

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

      PersonAssignment Class
      id
      person_id
      Person person
      Address assignedAddress
      Position assignedPosition
      

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

      【讨论】:

        【解决方案4】:

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

        但是,这是吹毛求疵。

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

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

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

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

        【讨论】:

          【解决方案5】:

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

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

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

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

          【讨论】:

            猜你喜欢
            • 2011-01-16
            • 1970-01-01
            • 1970-01-01
            • 2023-03-22
            • 1970-01-01
            • 2011-01-11
            • 1970-01-01
            • 2011-04-21
            • 2011-05-04
            相关资源
            最近更新 更多