C#中的三层应用程序 - 放置数据和业务模型的位置

时间:2013-02-10 01:20:27

标签: c# class design-patterns architecture n-tier-architecture

我正在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接口吗?

项目详情 该项目将由两个团队开发,一个位于美国,另一个位于东欧,将有四到五个团队成员。

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

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

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

1 个答案:

答案 0 :(得分:6)

您有数据模型(数据库架构),域模型和视图模型。

如果您的目标是解耦图层,那么您应该在这三个图层中的每个图层中都有代表Customer的不同类(但请参阅评论中的the article @Joe mentions)。

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

要将域模型映射到视图模型,请查看Automapper以了解域对象(例如业务对象)和视图模型之间的映射。

<强>更新

根据您的新信息,我将分享我的所作所为。这肯定不是唯一有效的方法。

鉴于分布式团队,明确的责任范围很重要。不同时区的不同人员,不同的团队负责人,将致力于代码。

鉴于在遗留数据库上构建新软件,您必须了解三个事实:

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

我会做以下

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

同样,根据我的背景,经验和偏好,我会如何处理它。这不是唯一有效的方法。