C# 关于N层应用程序的新手建议

C# 关于N层应用程序的新手建议,c#,nhibernate,n-tier-architecture,C#,Nhibernate,N Tier Architecture,好了,各位,这是另一个给你们的: 我从n层应用程序世界开始。我已经读了一些关于这个主题的书,一般的建议是n层应用程序的目标是抽象层之间的功能。因此,基于此,在n层应用程序中,常规模型是: 数据访问->业务层->演示 由于我是一名.NET开发人员,我认为为了增强与多种客户机类型(Silverlight、Web app甚至WinForms客户机)的集成,我应该在业务层使用WCF(Windows Communication Foundation)作为数据服务,以便客户机可以与之通信,而不管其类型如何。

好了,各位,这是另一个给你们的:

我从n层应用程序世界开始。我已经读了一些关于这个主题的书,一般的建议是n层应用程序的目标是抽象层之间的功能。因此,基于此,在n层应用程序中,常规模型是:

数据访问->业务层->演示

由于我是一名.NET开发人员,我认为为了增强与多种客户机类型(Silverlight、Web app甚至WinForms客户机)的集成,我应该在业务层使用WCF(Windows Communication Foundation)作为数据服务,以便客户机可以与之通信,而不管其类型如何。另外,我是NHibernate的超级粉丝,也是一个ORM。所以我的结构是这样的:

数据访问(NHibernate)->业务层(WCF)->演示(WPF、ASP.NET、WinForms)

好的,这就是设置。我对这种方法完全是新手,所以我想我可以在这里发帖,征求关于这种设置的建议。另外,我对如何在VS解决方案中设置这一点非常困惑,我喜欢在不同的项目中分离层,但是数据对象的抽象(如客户、订单等)呢?我是否将它们放在一个单独的库中?那么WCF呢?我知道程序员通过网络将数据类传输到客户端是一种罪过。专业人士是如何实现这一点的


谢谢,如果您有任何建议,我们将不胜感激。

这非常符合目标。不过,N-Tier比N-Layer要复杂一点,您可以通过询问“您的层实际上是否位于不同的物理服务器上?”来对比

根据业务层的复杂程度,您可能希望在业务层和服务层之间进一步抽象业务层。通常,这两个层紧密联系在一起,并位于同一物理服务器上。服务层通常充当BLL的门面

如果表示层位于同一服务器上,则ASP.NET或WinForms应用程序可能希望与BLL通信,而无需通过WCF服务

仔细阅读

您的域对象应该位于它们自己的程序集中—通常是您的域模型中。根据,将项目程序集命名为相应的名称是一种良好做法:

[公司].[产品或组件].[…]

我碰巧喜欢这种名称间距格式,通常使用:

[公司][产品][层][子层].[…]

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

在本例中,我有一个BLL和服务层。服务层提供WCF库中的实际实现,而演示文稿实际包含承载服务的WCF Web应用程序。将实现与接口分离始终是一种好的做法

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

至于通过网络传输的数据对象……我假设您指的是来自ORM的类。(域模型)你是对的,这通常被认为是不好的做法。解决方案是使用数据传输对象。你可以从图片中看到我有一个.Dto库。如果你能使用像AutoMapper这样的工具,我完全赞成,但是,将Dto添加到你的解决方案中会带来更多的复杂性和维护。我相信Dino Esposito写了一部很好的艺术作品我会尽力帮你找到的

希望这有帮助


[编辑]

我应该注意,我不熟悉nHibernate的功能。可能有更好的解决方案可以使用该ORM。我只使用过实体框架


[编辑2]


查看Dino Esposito的-

+1-一个很好的问题,将问题带到了点子上。这可能有点主观。Lucero,谢谢你的回答。我已经检查了这个问题,解决了一些疑问,但不幸的是,我不太喜欢他的方法。每个人似乎都反对将NHibernate实体对象暴露给WCF实际上,海报将WCF服务与NHibernate相关联,而不是使用中介服务类。我期待着尽可能多地提供抽象和集成。好的,你的回答非常简单,几乎解决了我的所有疑问。感谢VS解决方案方案和参考资料。我现在是strongl我想买一本应用程序架构书的硬拷贝。绝对是一个不错的选择。我自己也印了上面提到的两本书。阅读和参考资料都很棒。