一个新手关于N层应用程序的建议

12

大家好,这里有一个关于IT技术的问题:

我正在学习n-tier应用程序。我已经阅读了一些相关的资料,一般建议是在不同层之间抽象功能。基于这个原则,在一个n-tier应用程序中,通常的模型是:

Data Access(数据访问)-> Business Layer(业务逻辑层)-> Presentation(表示层)

作为.NET开发者,我认为使用WCF(Windows Communication Foundation)作为业务逻辑层上的数据服务可以增强与多个客户端类型(如Silverlight、Web应用或WinForms客户端)的集成。同时,我非常喜欢NHibernate作为ORM。因此,我的架构如下:

Data Access(NHibernate)-> Business Layer(WCF)-> Presentation(WPF、ASP.NET、WinForms)

好的,这就是我的设置。我完全是新手,所以我想在这里请求一些建议。另外,我非常困惑如何在VS解决方案中设置这个结构。我喜欢将层分离到不同的项目中,但数据对象(如顾客、订单等)的抽象怎么办?我要将它们放在一个单独的库中吗?还有WCF呢?我知道将数据类通过网络传输到客户端是一种编程上的不良习惯。那么,有什么更好的方法可以实现这一点呢?

谢谢,任何建议都将不胜感激。


+1 - 一个很好的问题,把问题点明了。虽然可能有点主观。 - Lucero
http://stackoverflow.com/questions/1650887/mixing-nhibernate-with-3-tier-developing - Lucero
Lucero,谢谢你的回复。我已经查看了这个问题并解决了一些疑问,但不幸的是我不太喜欢他的方法。所有人似乎都反对直接将NHibernate实体对象暴露给WCF,而帖子实际上是将WCF服务与NHibernate关联起来,而不是使用中介服务类。我期待尽可能地提供抽象和整合。 - Luis Aguilar
1个回答

14

这基本上是正确的。N-Tier比N-Layer更加复杂,可以通过问“您的层实际上是否位于不同的物理服务器上?”来进行对比。

根据您的业务层的复杂程度,您可能希望将其进一步抽象成业务和服务层之间。通常这两个层紧密相连并位于同一物理服务器上。服务层通常充当BLL的Facade。

如果您的Presentation层在同一台服务器上,则ASP.NET或WinForms应用程序可能希望直接与BLL通信,而无需经过WCF服务。

阅读Microsoft Patterns&Practices-应用程序架构指南

您的域对象应该位于它们自己的程序集中,通常是您的领域模型。根据Microsoft框架设计指南,按照以下方式命名您的项目程序集是一个好习惯:

[Company]。[ProductOrComponent]。[...]

我喜欢使用这种名称空间格式,并且通常会使用:

[Company]。[Product]。[Layer]。[SubLayer]。[...]

以下是使用解决方案文件夹组织每个项目的示例解决方案:

alt text

在此示例中,我有一个BLL和服务层。服务层通过WCF库提供实际实现,而Presentation实际上包含托管服务的WCF Web应用程序。将实现与接口分离总是一个好习惯。

/ Client文件夹可以忽略,我只是将其用作测试的示例控制台应用程序。任何消费您服务的客户端应用程序都应该有自己的解决方案,否则您将管理一个庞大的解决方案。

关于你要传输的数据对象......我假设你指的是来自ORM的类(领域模型)。你是对的,这通常被认为是不好的做法。解决方案是使用数据传输对象(Data-Transfer Objects)。从图片中可以看出我有一个.Dto库。如果你能够使用AutoMapper等工具,那么我完全支持,然而,将DTO添加到你的解决方案中会带来更多的复杂性和维护问题。我相信Dino Esposito在这个主题上写了一篇好文章。我会尝试为你找到它。
希望这可以帮助你。
[编辑]
我应该注意到,我不熟悉nHibernate的功能。可能有更好的解决方案来使用该ORM。我只用过Entity Framework。
[编辑2]
查看Dino Esposito的《数据传输对象的优缺点》(The Pros and Cons of Data Transfer Objects) - http://msdn.microsoft.com/en-us/magazine/ee236638.aspx

好的,你的回答非常直接,解决了我几乎所有的疑问。感谢提供VS解决方案和参考资料。我现在正在认真考虑购买那本应用架构书的实体版。 - Luis Aguilar
绝对是一个不错的购买。我自己印刷了这两本书的副本。非常棒的阅读和参考资料。 - Daniel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接