【问题标题】:Three tier app in C# - where to put data and business modelsC# 中的三层应用程序 - 放置数据和业务模型的位置
【发布时间】:2013-01-25 11:03:13
【问题描述】:

我正在用 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 层应用程序?

我应该把 Customer 模型放在哪里?我需要不止一个吗?我是否需要某个地方的 ICustomer 接口?

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

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

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

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

【问题讨论】:

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


【解决方案1】:

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

如果您的目标是解耦层,则应该在这三个层中的每一层中都有代表客户的不同类(但请参阅 cmets 中的 the article @Joe mentions)。

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

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

更新

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

考虑到分布式团队,明确的职责范围很重要。不同的人、不同的时区、不同的团队负责人将负责编写代码。

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

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

我会做以下事情

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

再次强调,鉴于我的背景、经验和偏好,我会采用这种方式。这不是唯一有效的方法。

【讨论】:

  • 从数据层映射到业务层,业务层中会有具体类的依赖。这被认为可以吗?而且听起来 UI 也将依赖于业务层中的具体类,好吗?
  • "OK" 取决于您的具体需求。如果您在一个不同成员分别在 UI、业务和数据层工作的团队中工作,那么这种依赖关系可能很难管理。如果只是您或一个非常小的团队,那么干净地分离和映射图层所增加的时间和复杂性可能不值得。对于中小型项目,我通常发现使用 EF 持久化的业务对象(没有 DTA)效果很好,并且我在 MVC 层中使用这些业务对象。其他人会不同意这是一个好方法。我不会在大型项目中这样做。
  • 你将如何“干净地分离和映射图层”? DTA 是什么意思?我也在为这个应用程序使用 DI 看到我的问题 - stackoverflow.com/questions/14785855/…
  • Sorry.. 意思是 DTO(数据传输对象...一个用于将数据从数据库传输到应用程序的对象,它通常反映数据库的逻辑存储架构)。我不会在小团队的项目中使用 DTO(我可能是少数),因为“干净地分离和映射图层”的好处不值得付出代价。我确实在更大的团队项目中使用它们。如果您可以更新您的问题以谈论团队规模和项目范围,我可以尝试给出更具体的建议。
  • 更新了答案。希望对您有所帮助。
猜你喜欢
  • 1970-01-01
  • 2010-11-30
  • 2019-05-22
  • 1970-01-01
  • 1970-01-01
  • 2016-04-14
  • 1970-01-01
  • 2013-01-10
  • 2013-03-04
相关资源
最近更新 更多