5

我正在用 C# 构建一个标准的三层应用程序

1 个前端控制台应用程序/但我可能会将其更改为 ASP.NET MVC 网页

2 业务逻辑层

3 使用连接到 SQL 数据库的实体框架的数据层/但这可能会更改为 windows azure

主要目的是展示一些客户数据。

存储在数据库中的客户具有以下字段 -

CustomerID
Firstname
Lastname
DateOfBirth
Othervalue1
Othervalue2
Othervalue3
Creationdate
Updatedate
IsDisabled //this represents "deleted" customers i.e. the app will never use deleted customers, but I want to keep them in the database anyway 

在中层,我只想要

CustomerID
Firstname
Lastname
DateOfBirth
Othervalue1
Othervalue2
Othervalue3
Updatedate

在第一个应用程序的前端,我只会展示

CustomerID
Firstname
Lastname
DateOfBirth

从从数据层加载客户(可能会改变)并在中间层然后在表示层(可能会改变)中使用该客户的角度来看,我如何正确实现 n 层应用程序?

我将客户模型放在哪里?我需要不止一个吗?我是否需要某个地方的 ICustomer 接口?

项目详情 该项目将由两个团队开发,一个位于美国,另一个位于东欧,团队成员将在 4 到 5 人之间。

该项目将不会使用一个遗留数据访问层。相反,我们将使用 Entity Framework 构建一个新的;我们需要设计和构建一个将在所有新应用程序中使用的数据层(对于这个应用程序,我们只需要客户表和一两个表)。其他项目将向该层添加其他表。

我正在使用 DI 注入 ICustomerRepository (请参阅这个SO question)。但将实现存储库和工作单元模式。

我关心的是适当地分离层。在接下来的几个月中,我们将添加许多新项目,新的数据层将快速增长。我们也在考虑在某个时候迁移到 Azure,因此我希望能够交换实体框架数据层,而无需重写业务层和前端层。

4

1 回答 1

6

您有一个数据模型(数据库模式)、一个域模型和一个视图模型。

如果您的目标是解耦这些层,那么您应该在这三层中的每一层中都有代表 Customer 的不同类(但请参阅@Joe在评论中提到的文章)。

您的数据访问技术将推动数据模型到领域模型的映射。如果您使用实体框架,它提供了在这两个模型之间进行映射的能力。

对于域模型到视图模型的映射,请查看Automapper用于域对象(例如业务对象)和视图模型之间的映射。

更新

根据您的新信息,我将分享我会做的事情。这当然不是唯一有效的方法。

给定一个分布式团队,明确的职责范围很重要。不同的人,在不同的时区,有不同的团队领导,将致力于代码。

鉴于基于旧数据库构建的新软件,您必须了解三个事实:

  • 更改旧数据库以适应新软件的需求并不容易。
  • 由于现有数据库的结构,新软件不应固有次优设计。
  • 在您构建的下一个应用程序中可能需要会污染当前应用程序设计的数据。

我会做以下事情

  • 创建表示旧数据库结构的数据传输对象 (DTO)。
  • 使用存储库和工作单元模式为业务对象层提供对 DTO 的访问。
  • 根据该应用程序的需要设计业务对象层(中间层,其类通常称为实体)。不要污染基于 DTO 的结构(最终是遗留 DB 的结构)的对象设计。
  • 使用 Automapper 等技术来简化这两层之间的映射工作。
  • 创建 UI 对象(在 MVC 术语中称为模型)表示给定 UI 屏幕(MVC 术语中的视图)将处理的数据。
  • 根据 UI 模型与业务对象(实体)的紧密程度,您可能想要使用 Automapper,或者可能只想在自定义代码中填充它们。

同样,鉴于我的背景、经验和偏好,这就是我将如何处理它。这不是唯一有效的方法。

于 2013-02-10T01:25:07.143 回答