这几乎达到了目标。然而,N-Tier 比 N-Layer 稍微复杂一些,可以通过询问“您的层实际上位于单独的物理服务器上吗?”来进行对比。
根据业务层的复杂程度,您可能希望在业务层和服务层之间进一步抽象它。通常,这两者紧密相连并位于同一物理服务器上。服务层通常充当 BLL 的外观。
如果表示层位于同一服务器上,则 ASP.NET 或 WinForms 应用程序可能希望与 BLL 进行通信,而不通过 WCF 服务。
继续阅读Microsoft 模式与实践 - 应用程序架构指南 http://apparchguide.codeplex.com/.
您的域对象应该存在于它们自己的程序集中,通常是您的域模型。根据微软框架设计指南 https://rads.stackoverflow.com/amzn/click/com/0321545613,最好相应地命名您的项目程序集:
[公司].[产品或组件].[...]
我碰巧喜欢这种名称间距格式并且通常使用:
[公司].[产品].[图层].[子图层].[...]
Here is an example solution using solution folders to organize each project:
在此示例中,我有一个 BLL 和服务层。服务层提供 WCF 库中的实际实现,而演示文稿实际上包含托管服务的 WCF Web 应用程序。将实现与接口分开始终是一个好习惯。
/Client 文件夹可以忽略,我只是将其用作示例控制台应用程序进行测试。任何使用您的服务的客户端应用程序都应该有自己的解决方案,否则您将管理一个巨大的解决方案。
至于通过网络传输的数据对象...我假设您指的是 ORM 中的类。 (域模型)您是正确的,它通常被认为是不好的做法。解决方案是使用数据传输对象。你可以从图片中看到我有一个.Dto库。如果您能够使用像 AutoMapper 这样的工具,那么我完全支持它,但是,将 DTO 添加到您的解决方案中会带来进一步的复杂性和维护。我相信迪诺·埃斯波西托(Dino Esposito)就这个主题写了一篇很好的文章。将尽力为您找到它。
希望这可以帮助。
[EDIT]
我应该指出,我不熟悉 nHibernate 的功能。使用 ORM 可能有更好的解决方案。我只使用过实体框架。
[EDIT 2]
看看迪诺·埃斯波西托的 -数据传输对象的优点和缺点 http://msdn.microsoft.com/en-us/magazine/ee236638.aspx