2013-02-10 90 views
3

我建立在C#标准的三层应用程序三层应用程序 - 在哪里把数据和商业模式

1个控制台应用程序的前端/但我可能会改变这一个ASP.NET MVC的Web页面

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,所以我希望能够替换实体框架数据层,而不必重写业务层和前端层。

+0

我认为这是更主观的,你可能会想。 Mark Seeman在http://blog.ploeh.dk/2012/02/09/IsLayeringWorthTheMapping.aspx – Joe 2013-02-10 01:23:04

+0

写了一篇很棒的文章。我正在阅读他关于DI的书以及他的一些博客文章。他们被认为是令人发指。 – tom 2013-02-10 02:25:38

回答

5

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

如果您的目标是分离图层,那么您应该在这三个图层中的每个图层中分别代表客户的类(但请参阅注释中的the article @Joe mentions)。

您的数据访问技术将推动数据模型到域模型的映射。如果您使用实体框架,则可以在这两种模型之间进行映射。

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

UPDATE

基于新的信息,我将分享我会做什么。这当然不是唯一有效的方法。

鉴于分散的团队,清晰的责任线是重要的。不同的人,在不同的时区,不同的团队领导,将在代码上工作。

赋予了新的软件在旧的数据库建立,必须注意的三个事实:

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

我会做以下

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

再次,这就是我将如何处理它给我的背景,经验和喜好。这不是唯一有效的方法。

+0

要从数据层映射到业务层,业务层中将存在对具体类的依赖关系。这被认为是好的吗?而且这听起来UI将依赖于业务层中的具体类,也可以吗? – tom 2013-02-10 04:12:15

+0

“确定”取决于您的具体需求。如果你在一个团队中工作,其中不同的成员分别在UI,业务层和数据层上工作,那么这种依赖关系可能很难管理。如果只是你或者一个非常小的团队,干净地分离和映射图层所增加的时间和复杂性可能并不值得。对于小型到中型项目,我通常发现使用EF(没有DTA)持久存储的业务对象可以很好地工作,并且我在MVC层中使用这些业务对象。其他人会不同意这是一个好方法。我不会在一个大型项目中这样做。 – 2013-02-10 08:23:22

+0

你会如何“干净地分离和映射图层”? DTA是什么意思?我用这个应用程序的DI也看到我的问题 - http:// stackoverflow。com/questions/14785855/ninject-in-a-three-tier-application – tom 2013-02-10 17:45:54

相关问题